2012-06-13 23 views
6

Tôi đã thử tất cả các tiêu đề. Có và không có độ dài nội dung.900 MB http tải xuống cưỡng bức hiếm khi kết thúc

Vấn đề là việc tải xuống sẽ bị gián đoạn khoảng nửa chừng. Nhưng hầu hết thời gian.

Đôi khi nó hoạt động tốt.

Sử dụng tài nguyên máy chủ là không đáng kể. Tất cả các tệp cấu hình đều ổn. Tôi không chạy kịch bản php trong khi nó đi.

Có ai nhìn thấy điều này trước đây không? Nó không phải là lỗi của tôi? Tại sao đôi khi?

$file = "http://domain.com/files/".$item_number.".mov"; 
header('Pragma: no-cache'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Description: File Download'); 
header('Content-Type: application/force-download'); 
//header ('Content-Type: video/quicktime');//doesnt seem to download at all here 
header('Content-Length: '.filesize($file)); 
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($file); 
exit(); 

Cảm ơn bạn, Xin lỗi, đây là lần đầu tiên của tôi.

+4

Bản tải xuống này có được thực hiện một đoạn mã PHP không? Bạn có thể cho chúng tôi thấy mã không? –

+3

Dừng các câu hỏi đóng chỉ vì chúng được người mới hỏi. Đây là một câu hỏi thực sự 100%. –

+0

Bạn đã xem các tệp nhật ký của mình chưa? PS - Mã xin vui lòng. – xbonez

Trả lời

3

Điều này có thể có một số lý do.

Bạn đang nói rằng tài nguyên máy chủ là OK, nhưng tôi nghĩ rằng PHP readfile() tải toàn bộ tệp vào bộ nhớ trước khi gửi. May mắn thay có một tài liệu tốt solution trong tài liệu bạn chắc chắn nên sử dụng để ngăn chặn việc gặp sự cố với nhiều lượt tải xuống :)

Ngoài ra, bạn có đặt thời gian thực thi tập lệnh thành vô hạn không?

Tiếp theo sẽ là cài đặt máy chủ của bạn. Có lẽ họ đóng kết nối cho một số lý do thời gian chờ/tài nguyên heo.

Sử dụng công cụ phát triển Google Chromes để kiểm tra kỹ các tiêu đề bạn đang gửi. PHP tự thiết lập một số tiêu đề. Bạn nên đặt session_cache_limiter(false); vào đầu tập lệnh. Nếu tôi nhớ chính xác, ngay cả Expires: Thu, 19 Nov 1981 08:52:00 GMT ... Tại sao điều này là xấu? Tiếp theo;)

Bạn có thể gửi tiêu đề Etag và Last-Modified. Tôi tổng hợp nó là một định danh duy nhất cho tài nguyên của bạn, giúp bạn có thể tiếp tục tải xuống. Tôi nghĩ rằng việc tìm kiếm những bài viết hay về điều này tốt hơn là chỉ cho bạn một số câu ở đây. Trong trường hợp của bạn, bạn có thể sử dụng chức năng PHP stat() để tạo Etag.

Có một số người đấu tranh với tiêu đề và tải về, bạn có thể bắt đầu (hoặc sửa chữa trường hợp của bạn) here

Tóm tắt:

  • Kiểm tra/hạn chế/cài đặt nguồn PHP/máy chủ hết hạn của bạn
  • Hãy chắc chắn gửi tệp đệm
  • Làm cho có thể tiếp tục tải xuống
  • Kiểm tra tiêu đề bạn đang gửi

Sau này, bạn sẽ ổn thôi. Với việc tiếp tục lại ngay cả khi nó vẫn bị ngắt ...

Tiến độ và thành công tốt!

+1

Từ hướng dẫn sử dụng "readfile() sẽ không hiển thị bất kỳ vấn đề bộ nhớ nào, ngay cả khi gửi các tệp lớn. Nếu bạn gặp lỗi hết bộ nhớ, hãy đảm bảo rằng bộ đệm đầu ra bị tắt với ob_get_level()." – Matthew

+0

Có lẽ máy chủ chia sẻ hoặc cái gì khác - Tôi chỉ tóm tắt tất cả những gì tôi biết có thể là lý do :) readfile() sẽ không hiển thị vấn đề bộ nhớ * NẾU * ... Đây chắc chắn là một trong danh sách. –

+0

http://stackoverflow.com/questions/6627952/why-does-readfile-exhaust-php-memory máy chủ crap, nhiều người dùng, về cơ bản những gì tôi đã nói - và điều chính vẫn là để loại bỏ heo tài nguyên như thế này –

Các vấn đề liên quan