For循环导致内存耗尽

时间:2012-11-27 14:00:28

标签: php memory

我正在CMS /框架中创建一个名为Processwire的网站,现在我确实希望用数据库结果中收集的值填充一些数组(在processwire中称为页面)。 现在发生的是我得到一个内存错误,我知道我应该提高内存限制但是感觉不对,因为页面会越来越多,然后它已经存在,负载将变大,我可能会结束增加内存限制甚至更多。现在我想从大堆中挑选批次并处理它们然后选择下一批。 这是导致崩溃的部分:

    for($i = 0; $i<=$count_log; $i+=100)
{
    $all_log_files = $pages->find("template=logs, start=$i, limit=100");
    foreach($all_log_files as $log_file)
    {
        $u++;
        if(empty($actions["$log_file->action"]))
        {
            $actions[$log_file->action] = 1;
        }
        if(empty($ips["$log_file->ip"]))
        {
            $ips[$log_file->ip] = 1;
        }
        if(empty($values["$log_file->value"]))
        {
            $values[$log_file->value] = 1;
        }
        if(empty($results["$log_file->result"]))
        {
            $results[$log_file->result] = 1;
        }
    }
}

现在您可以看到我已经尝试制作“批次”,但我失败了,因为我仍然会收到错误...

我能做些什么来解决这个问题,或者我没有做任何事情,我应该提高内存限制吗?

编辑:

具体错误: 致命错误:第47行的/xxx/xxx/xxx/xxx/wire/core/DatabaseQuery.php中允许的内存大小为33554432字节(试图分配6个字节)

1 个答案:

答案 0 :(得分:3)

您遇到了内存问题,因为您尝试同时存储在内存中的数据太大了。您可以增加内存限制来保存所有数据,也可以存储更少的数据,并更改算法以处理批量数据。

例如,如果您有一个使用$results中存储的值的函数,那么您可以尝试更改此函数以仅与部分结果一起工作,并为每次迭代调用函数,然后在迭代完成后清空数组。