Ответ 1
Вам понадобится временный файл, в который вы помещаете бит исходного файла плюс добавление:
$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 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
можно непосредственно написать ответ на диск.