附加到php中的大文件

时间:2015-01-15 01:00:15

标签: php io

我有一个非常大的.csv文件,我正在从mysql查询中写入行。我无法直接导出,因为我必须处理每一行,但这不是什么大问题。问题是当我在文件上调用fwrite()时出现内存不足异常:

Allowed memory size of 1572864000 bytes exhausted (tried to allocate 2262361 bytes)

直到有问题的文件达到700MB左右才会发生这种情况。失败的代码是循环的,如下所示:

$file=fopen(export_path."/".$filename, "a");
fwrite($file, implode("\n", $output)."\n");
fclose($file);

其中output []最多5,000行。我曾经把文件保持打开状态,直到完成所有的写作,但想到可能让文件句柄打开可能会占用很多内存,但没有骰子。有什么策略可以通过php附加到非常大的文件?

我看了What is the best way to write a large file to disk in PHP?,但我仍然遇到内存不足的异常。有没有办法在PHP中写入大文件而不必将文件加载到内存中?

1 个答案:

答案 0 :(得分:0)

这里的问题可能与您尝试存储在数组中的数据量有关,因此解决此问题的方法实际上是在处理数据库记录时将行写入文件,而不是累积数组中的大量数据,然后在末尾使用implode()将单个转储中的所有数据写入文件。

<?php
/* $aRecords contains the database records as returned from your SQL query ($output) */
if (count($aRecords) > 0) {
  $hFile = fopen('output.txt', 'a') or die('Unable to open file with writable permission');
  foreach ($aRecords as &$aRecord) {
    /* Do your processing here, assign the data to $sLine instead of adding an element to 
       an array such as $aRecords[] = 'data'; or $output[] = 'data'; */
    $sLine = $aRecord['whatever'] . $aRecord['from'] . $aRecord['your'] . $aRecord['data'];
    fwrite($hFile, $sLine . "\n");        
  }
  fclose($hFile);
}