在解决问题4个多小时之后,我终于找到了导致以下错误的代码部分:
PHP致命错误:耗尽的268435456字节的允许内存大小 (尝试分配8388608字节)
我正在从数据库中获取数据。查询返回包含33个条目的数据数组(不是那么多...) 我用一个for循环遍历该数组以获取时间差,如果差太大(简单的if-else),则标记该数组。...很难解释,但是我想你明白我的意思了看我的代码...很简单:
for($i = 0; $i <= count($customerList); $i++) {
$date1 = date_create($customerList[$i]["lastUpdate"]);
$interval = date_diff($date1, $date2);
$min=$interval->format('%i');
$sec=$interval->format('%s');
$hour=$interval->format('%h');
$mon=$interval->format('%m');
$day=$interval->format('%d');
$year=$interval->format('%y');
$date3 = date("H");
if(($year > 0) || ($mon > 0) || ($day > 0)) {
$customerList[$i]["flag"] = 1;
}
else {
if($date3 >= 6 && $date3 <= 21) {
if(($hour > 0) || ($min > 29)) {
$customerList[$i]["flag"] = 1;
}
}
}
}
变量$date2
在for循环之前使用以下代码行定义:
$date2 = date_create($lastUpdateTime["lastUpdate"]);
可悲的是,我真的看不到这段代码如何导致该错误,因为我认为这实际上并不需要占用太多内存...
我100%确保错误来自此for循环,因为当我删除它时,错误就消失了。另外,当我将此for循环放入其他视图中时,也会导致相同的错误。
我通过增加PHP的最大内存限制解决了这个问题,但我仍然想知道这个for循环如何导致该问题。
我真的很感谢任何解释,因为我在互联网上找不到任何东西...
哦,我只在这里添加查询,这样您就可以看到我没有获取很多数据(该网站处理了更大的查询而没有任何问题...):
SELECT c.id, c.type, c.name, c.environment, cd.customer, MAX(cd.createdAt) AS lastUpdate FROM customerdata AS cd JOIN customers c ON cd.customer = c.id GROUP BY customer ORDER BY c.name ASC
谢谢!
答案 0 :(得分:1)
您的for
循环条件是$i<=count($customerList)
而不是$i<count($customerList)
。这意味着您对$customerList[$i]
的访问超出了数组的末尾,并在此过程中创建了一个新元素。现在count($customerList)
大一个了,因此循环需要无限次迭代,从而为不断增长的阵列使用越来越多的RAM。
当您初次访问元素时,当您阅读"lastUpdate"
时,您还将收到一条警告消息:该元素尚不存在。稍后,当您设置"flag"
元素时,您将创建数组元素。
要使循环条件更易于阅读并防止此类错误输入,可以使用foreach
循环:
foreach ($customerList as $customer) {
$date1 = date_create(customer["lastUpdate"]);
$interval = date_diff($date1, $date2);
...