Tôi đang tìm cách hiệu quả nhất để ghi nội dung của luồng đầu vào PHP vào đĩa, mà không cần sử dụng nhiều bộ nhớ được cấp cho tập lệnh PHP. Ví dụ: nếu kích thước tệp tối đa có thể được tải lên là 1 GB nhưng PHP chỉ có 32 MB bộ nhớ.PHP sử dụng fwrite và fread với luồng đầu vào
define('MAX_FILE_LEN', 1073741824); // 1 GB in bytes
$hSource = fopen('php://input', 'r');
$hDest = fopen(UPLOADS_DIR.'/'.$MyTempName.'.tmp', 'w');
fwrite($hDest, fread($hSource, MAX_FILE_LEN));
fclose($hDest);
fclose($hSource);
Có phải fread bên trong một fwrite như đoạn mã trên có nghĩa là toàn bộ tệp sẽ được tải vào bộ nhớ?
Để làm điều ngược lại (viết một tệp đến luồng đầu ra), PHP cung cấp hàm có tên fpassthru mà tôi cho rằng không chứa nội dung của tệp trong bộ nhớ của tập lệnh PHP.
Tôi đang tìm nội dung tương tự nhưng ngược lại (viết từ luồng đầu vào vào tệp). Cảm ơn bạn đã hỗ trợ bạn có thể cung cấp.
Cảm ơn pauld, tôi cũng thích ý tưởng của bạn về việc không sử dụng nữa. – Lakey
@pauld Tuyệt vời! Để thực hiện tốt nhất, unset nên được sử dụng giống như 'while (...) {...} unset ($ chunk);' tái phân bổ bộ nhớ mỗi lần lặp lại sẽ không có nhiều tác động, nhưng giải phóng bộ nhớ đó _after_, quan trọng hơn một chút ở đây. –
@TonyChiboucas Tại sao bạn sẽ giải phóng bộ nhớ 1024 byte? – marijnz0r