我正在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个字节)
答案 0 :(得分:3)
您遇到了内存问题,因为您尝试同时存储在内存中的数据太大了。您可以增加内存限制来保存所有数据,也可以存储更少的数据,并更改算法以处理批量数据。
例如,如果您有一个使用$results
中存储的值的函数,那么您可以尝试更改此函数以仅与部分结果一起工作,并为每次迭代调用函数,然后在迭代完成后清空数组。