1

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

    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字节)

4

1 回答 1

3

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

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

于 2012-11-27T14:04:36.790 回答