CSV文件创建期间内存不足

时间:2013-12-19 22:37:01

标签: php mysql csv

我有一份报告说我必须编写要运行的代码,它必须将一个月的数据编译成CSV文件。数据接近112,000行,每行47个数据单元。

当我尝试编写文件时,我的内存不足。我认为fflush可能会这样做,但似乎没有。代码是PHP。

$filename = str_replace(array('-',':','_', ' '), '', "export_" . date("m-d-Y H:i:s") . ".csv");
header('Content-Type: text/csv');
header("Content-Disposition: attachment; filename='$filename'");
header('Pragma: no-cache');
header('Expires: 0');
$con=mysqli_connect("localhost","root","changedForSecurity","reports");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result = mysqli_query($con,"SELECT * FROM testing");
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$fp = fopen($filename, 'w');
$i=1;
while($row = mysqli_fetch_array($result)) {

    if ($i < 15000) {
        fputcsv($fp, $row);
        $i++;
    } else {
        fflush($fp);
        $i=1;
        fputcsv($fp, $row);
    }

}

2 个答案:

答案 0 :(得分:0)

您必须更改内存限制设置。这可以通过在php.ini文件中手动更改它来完成,也可以在代码中完成:

ini_set('memory_limit', '256M');

或在.htaccess文件中:

php_value memory_limit 256M

有一点需要注意的是,您应该尝试限制您在此处设置的金额。如果您的设置为64M,请先尝试128M。或者,如果设置为128M,请尝试256M。如果没有必要,将它设置得太高就太过分了。

您可以通过执行此操作来检查您正在使用的内存:

$initMemory = memory_get_usage();
// your code
$afterMemory = memory_get_usage() - $initMemory;
echo $afterMemory;
exit;

答案 1 :(得分:0)

除了增加ini中的内存限制外,您还可以分割文件。不是那么优雅,但它可以在紧要关头工作。