内存由于PHP循环查询数据而耗尽

时间:2013-09-27 21:36:33

标签: php mysql for-loop pdo

我有一些代码循环从DB收到的数据,但问题是内存耗尽。我的内存限制设置为128 MB。我测试返回的总行数约为200k。所以我不知道它是否只是太多的数据,或者是否有办法缓冲表并且不能将整个事物一次性存储在内存中。

内存耗尽错误将在while语句启动的行处抛出。

    $queryResult = $dbCon->prepare( $sqlQuery );
    $queryResult -> bindParam(':field1', $field1);
    $queryResult -> bindParam(':field2', $field2);
    $queryResult -> bindParam(':field3', $field3);
    $queryResult -> execute();
    $allData = array();
    $i=0;
    while ( $row = $queryResult->fetch(PDO::FETCH_ASSOC) )
    {
        foreach ( $row as $sKey=>$vVal )
        {
            if( $i == 0 )
            {
                $this->allHeaders[] = $sKey ;
            }
            $allData[ $i ][ $sKey ] = $vVal;
        }
        $i++;
    }

2 个答案:

答案 0 :(得分:0)

这里有两个问题:

  • 在while语句中分配......这是不好的做法,会导致问题
  • 直接对SQL结果集进行foreach迭代,即使你似乎使用了一些抽象层...这可以工作,但我不推荐它

如果你想避免内存问题(你的数据库有多大?几GB,我假设......)你只需要将结果集拆分成块(参见SQL-“LIMIT”语句)或迭代只有在你的最后一个结果被处理之后 - 因此你可以做一切需要在一次迭代中完成的事情

答案 1 :(得分:0)

要解决崩溃问题,请创建.htaccess文件并添加以下行

php_value memory_limit 256M

注意:您可以使用值2的幂(2 * 2,2 * 3,2 ** 4 ....)

但是,更改内存限制正在改变问题。问题的根源是使用大量内存。如果程序有更多内存,您可能会发现程序稍后会崩溃。

尝试使用fetchAll()并查看是否有所作为

$rows = $queryResult->fetchAll();