关于php查询mysql返回大数据集得问题

今天接到测试反馈说一个后台导出报表得程序出问题了,无法导出。然后就看了下问题,提示: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in xxxx.php

这个错误比较常见,就是分配给PHP得内存不够了,然后就挂了。。,内存使用如下: 171.600578308MB

针对这个问题我检查了下代码,发现导出时是导出的全表的数据(SELECT * FROM TABLE),而且对这些数据的处理是在一个循环中完成的(数据都保存在一个数组中了),这个时候PHP内存占用异常的大,最后直接挂掉了。

这个时候我开始修改代码,还是个大工程,首先就是要在mysql查询时不让mysql将结果集直接发送到php的缓冲区,这样Php内存占用就不会很夸张;第二是将获取结果集放到循环中(mysql_fetch_array),这样就不会出现超大的PHP变量。

也就是说我们需要注意几点:

1、查询时大结果集尽量使用mysql_unbuffered_query();PDO则设置$connection->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

2、不要直接获取到大结果集进行遍历,而是要在遍历时获取单行数据进行处理,否则很可能因为内存不足挂掉。

3、如果可以尽量分页处理大结果集

Published: November 28 2011

blog comments powered by Disqus