在PHP中将大文件写入磁盘的最佳方法是什么?

时间:2011-01-25 19:37:45

标签: php file file-io fwrite

我有一个PHP脚本偶尔需要将大文件写入磁盘。使用file_put_contents(),如果文件足够大(在这种情况下大约2 MB),PHP脚本内存不足(PHP致命错误:########字节的允许内存大小耗尽)。我知道我可以增加内存限制,但这对我来说似乎不是一个完整的解决方案 - 必须有更好的方法,对吗?

在PHP中将大文件写入磁盘的最佳方法是什么?

3 个答案:

答案 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);

似乎我总是想念那些显而易见的东西。正如Marc所指出的,有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);