2010-06-01 39 views
5

Trong khi thiết lập hệ thống quản lý tệp trực tuyến và bây giờ tôi đã nhấn một khối.Đọc tệp PHP() và tải xuống lớn

Tôi cố gắng để đẩy các tập tin cho khách hàng sử dụng này modified version of readfile:

function readfile_chunked($filename,$retbytes=true) { 
    $chunksize = 1*(1024*1024); // how many bytes per chunk 
    $buffer = ''; 
    $cnt =0; 
    // $handle = fopen($filename, 'rb'); 
    $handle = fopen($filename, 'rb'); 
    if ($handle === false) { 
     return false; 
    } 
    while (!feof($handle)) { 
     $buffer = fread($handle, $chunksize); 
     echo $buffer; 
     ob_flush(); 
     flush(); 
     if ($retbytes) { 
      $cnt += strlen($buffer); 
     } 
    } 
     $status = fclose($handle); 
    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
} 

Nhưng khi tôi cố gắng để tải về một tập tin 13 MB, nó chỉ phá vỡ lúc 4 MB. Điều gì sẽ xảy ra ở đây? Nó chắc chắn không phải là giới hạn thời gian của bất kỳ loại nào bởi vì tôi đang làm việc trên một mạng nội bộ và tốc độ không phải là một vấn đề.

Giới hạn bộ nhớ trong PHP được đặt là 300 MB.

Cảm ơn bạn đã được trợ giúp.

+2

Chắc chắn có gì đó trong nhật ký lỗi, giả sử bạn đã bật tính năng này. Kiểm tra và sửa đổi câu hỏi. – timdev

+0

Không. Không có gì liên quan đến điều này trong nhật ký lỗi. Tất cả những gì tôi có là một số cảnh báo không dùng nữa từ các tập lệnh khác nhau. – Nirmal

+0

Bạn đang sử dụng ứng dụng nào để nhúng nội dung? Hành vi có thay đổi nếu bạn sử dụng một ứng dụng khách khác không? Đoán của tôi sẽ là đại lý bạn đang sử dụng không thể đối phó với mã hóa chunked lớn. Hãy thử một khách hàng khác và/hoặc đánh hơi lưu lượng truy cập. – symcbean

Trả lời

4

Rất có thể bạn đang đạt đến giới hạn bộ đệm phản hồi do máy chủ web của bạn đặt. IIS và FastCGI được biết là có 4mb làm kích thước bộ đệm mặc định. Tôi sẽ bắt đầu tìm kiếm của bạn bằng cách xem xét máy chủ web < -> cấu hình PHP SAPI.

+0

Có bất kỳ hạn chế nào khác trong việc tăng giới hạn bộ đệm không? Sẽ thiết lập nó đến, nói, 50 MB tạo ra một vấn đề cho kinh nghiệm duyệt web nói chung? Cảm ơn vì bất kỳ thông tin chi tiết nào. – Nirmal

+0

Không, bên cạnh dấu chân bộ nhớ tiềm năng của máy chủ web và bộ nhớ giờ đây rẻ. – m1tk4

+0

'Lưu ý: 'Tôi ước gì tôi có thêm câu trả lời cho câu hỏi này, nhưng vì tiền thưởng sắp hết, phải trả lời câu trả lời này. – Nirmal

1

KHÔNG tuôn ra đầu ra của bạn nhưng cố gắng lưu nó và sau đó gửi cho khách hàng trong một phần.

ob_clean(); // in case anything else was buffered 
ob_start(); 

// do read/echo operations 

ob_end_flush(); 
+0

Tại sao anh ấy lại làm vậy? Toàn bộ điểm sử dụng hàm readline() thay thế là tránh đọc toàn bộ tệp vào không gian bộ nhớ của PHP cùng một lúc. Câu trả lời của bạn hoàn toàn đánh bại mục đích đó. – timdev

+0

@timdev - Ý của bạn là hàm readfile() '? Vâng, bạn nói đúng. Gửi tập tin như một mảnh toàn bộ là những gì chúng ta muốn tránh ở đây. – Nirmal

+0

@Nirmal, er, yes, duh. – timdev

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