【发布时间】:2017-03-14 11:11:46
【问题描述】:
我已经编写了一个下载 csv 文件的代码,它可以完美运行,但是如果记录(行)的数量超过 100,000+,它就会出错..
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
这是因为我将整个结果提取到一个数组中,然后使用 foreach() 对其进行循环。
$query = "SELECT msisdn, duration FROM `users` WHERE id=".$id.";";
$dataProvider = new CSqlDataProvider($query);
$results = $dataProvider->getData();
// opening file
$fp = fopen($filename, "w");
fwrite($fp, "Msisdn,,Duration (seconds) \r\n");
foreach ($results as $result) {
fwrite($fp, $result['msisdn'] . ",," . $result['duration'] . "\r\n");
}
// closing file;
fclose($fp);
exit;
而且我认为使用 while() 循环一次获取和处理一行的内存效率更高。我如何在 php yii 1.1 框架中做到这一点?
类似的东西..
while($row = $nextrow)
fwrite();
fclose($fp);
【问题讨论】:
-
是的,效率更高,但数据库负载更大。试试limit+offset,然后添加新行。
-
$query = "SELECT msisdn, duration FROM
usersWHERE id=".$id." limit 50000 offset 0;"; - 第一个查询。 $query = "SELECT msisdn, duration FROMusersWHERE id=".$id." limit 50000 offset 50000"; - 第二个查询 -
当查询结果为空时 - 停止脚本。
-
查询如何运行两次?我的意思是两个查询
-
在 for/while 循环中:)