简单的循环会导致内存耗尽错误

时间:2018-07-06 09:02:51

标签: php date for-loop

在解决问题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

谢谢!

1 个答案:

答案 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);
...