Bạn sẽ cần một tập tin tạm thời, trong đó bạn đặt bit của file nguồn cộng với những gì được nối:
$sp = fopen('source', 'r');
$op = fopen('tempfile', 'w');
while (!feof($sp)) {
$buffer = fread($sp, 512); // use a buffer of 512 bytes
fwrite($op, $buffer);
}
// append new data
fwrite($op, $new_data);
// close handles
fclose($op);
fclose($sp);
// make temporary file the new source
rename('tempfile', 'source');
Bằng cách đó, toàn bộ nội dung của source
không được đọc vào bộ nhớ. Khi sử dụng cURL, bạn có thể bỏ qua việc thiết CURLOPT_RETURNTRANSFER
và thay vào đó, thêm một bộ đệm đầu ra mà viết vào một tập tin tạm thời:
function write_temp($buffer) {
global $handle;
fwrite($handle, $buffer);
return ''; // return EMPTY string, so nothing's internally buffered
}
$handle = fopen('tempfile', 'w');
ob_start('write_temp');
$curl_handle = curl_init('http://example.com/');
curl_setopt($curl_handle, CURLOPT_BUFFERSIZE, 512);
curl_exec($curl_handle);
ob_end_clean();
fclose($handle);
Có vẻ như tôi luôn nhớ rõ ràng. Như được Marc chỉ ra, có CURLOPT_FILE
để ghi trực tiếp phản hồi vào đĩa.
Nguồn
2011-01-25 19:40:41
nguồn gốc của dữ liệu là gì? Ngoài ra, hầu hết các cấu hình PHP sẽ có thể xử lý 2MB không có vấn đề gì. Giới hạn bộ nhớ của bạn có thể là theo cách. – webbiedave
Tệp này đến từ đâu? Nếu nó tồn tại trên đĩa rồi, thì 'copy()' sẽ là thích hợp nhất. – mario
Trong trường hợp này, tôi nhận được tập tin từ một máy chủ từ xa bằng cách sử dụng curl. Vì vậy, tôi có nó trong một biến. –