【发布时间】:2018-07-06 09:02:51
【问题描述】:
在本地化问题上工作了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
谢谢!
【问题讨论】:
-
你应该在
for($i = 0; $i < count($customerList); $i++)中只使用<而不是<=。 -
通过在 for 循环中使用
$i <= count(..,您可以在循环内创建新的数组元素。这使得循环无限运行,每次创建一个新元素并在下一次迭代中处理它。您可以将for循环替换为foreach,这样更易于阅读并防止出现此类错误。 -
您也可以简单地将
$interval->format()调用替换为$interval->i,$interval->s, ... 就像现在一样,您正在获取存储在DateInterval对象中的数字,格式化它们作为字符串,并将字符串转换回数字。 -
@KarstenKoop 非常感谢您对改进我的代码的帮助和建议:)