Вам понадобится временный файл, в который вы помещаете биты исходного файла плюс то, что должно быть добавлено:
$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');
Таким образом, все содержимое source
не читается в память,При использовании cURL вы можете опустить установку CURLOPT_RETURNTRANSFER
и вместо этого добавить выходной буфер, который записывает во временный файл:
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);
Кажется, что я всегда упускаю очевидное.Как указал Марк, есть CURLOPT_FILE
для прямой записи ответа на диск.