我有一个PHP脚本偶尔需要将大文件写入磁盘。使用file_put_contents()
,如果文件足够大(在这种情况下大约2 MB),PHP脚本内存不足(PHP致命错误:########字节的允许内存大小耗尽)。我知道我可以增加内存限制,但这对我来说似乎不是一个完整的解决方案 - 必须有更好的方法,对吗?
在PHP中将大文件写入磁盘的最佳方法是什么?
答案 0 :(得分:15)
您需要一个临时文件,您可以在其中放置源文件的位以及要附加的内容:
$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
直接将响应写入磁盘。
答案 1 :(得分:1)
使用fwrite()
答案 2 :(得分:0)
尝试this answer:
$file = fopen("file.json", "w");
$pieces = str_split($content, 1024 * 4);
foreach ($pieces as $piece) {
fwrite($file, $piece, strlen($piece));
}
fclose($file);