我有一份报告说我必须编写要运行的代码,它必须将一个月的数据编译成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);
}
}
答案 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中的内存限制外,您还可以分割文件。不是那么优雅,但它可以在紧要关头工作。