У меня есть PHP-скрипт, который иногда приходится писать большие файлы на диск. Используя file_put_contents()
, если файл достаточно велик (в данном случае около 2 МБ), у PHP-скрипта заканчивается память (PHP Fatal error: Разрешенный размер памяти ######## байт исчерпан). Я знаю, что могу просто увеличить лимит памяти, но это не похоже на полное решение для меня – должен быть лучший способ, не так ли?
Каков наилучший способ записи большого файла на диск в PHP?
Вам понадобится временный файл, в который вы помещаете биты исходного файла плюс то, что должно быть добавлено:
$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
чтобы напрямую написать ответ на диск.
Запись строк за строкой (или пакет за пакет в случае двоичных файлов) с использованием таких функций, как fwrite()
Попробуйте этот ответ :
$file = fopen("file.json", "w"); $pieces = str_split($content, 1024 * 4); foreach ($pieces as $piece) { fwrite($file, $piece, strlen($piece)); } fclose($file);