为什么一个循环超过10,000次的foreach会耗尽内存?

6

我正在开发一个循环/迭代10,000多次的PHP脚本:

foreach ($array_with_items as $item) {

    // Instantiate the object
    $obj_car = new CarAds($puk, 'ENG', '5');

    $obj_car->detail1 = "Info about detail1";
    $obj_car->detail2 = "Info about detail2";
    $obj_car->detail3 = "Info about detail3";
    $obj_car->detail4 = "Info about detail4";

    // Saves to the database
    $obk_car->save;
}

当我运行这段代码时,我的机器会耗尽内存。在这个foreach循环中,我该怎么做才能清理内存?

你写的是$obj_car,但后面却出现了$obk_car,这是有意为之吗? - Alex
你正在每次迭代时创建一个 CarAds 的实例。 - jap1968
3个回答

8

您正在根据$array_with_items中的项目数量实例化CarAds对象。 每个对象都会分配内存。

在save()方法之后,您应该使用unset()函数对对象进行取消分配:

// Saves to the database
$obj_car->save;

// Unset unneeded object
unset($obj_car);

您可以使用memory_get_usage()函数(请参阅http://php.net/manual/en/function.memory-get-usage.php)来检查内存消耗。


5
在循环结束时尝试使用unset($obk_car)

2
foreach 循环结束时 释放 对象。
unset($obj_car);

如果您的脚本仍需要更多内存,您可以在php.ini文件中的此行增加限制
memory_limit = 128M

编辑:

  • 如果您使用的是 PHP >= 5.3.0,您可以通过调用 gc_collect_cycles 来强制进行垃圾回收。
  • 如果您使用的是 PHP >= 5.2,则来自 IBM 的this article 是一篇有趣的文章。

1
您也可以将参数设置为-1来删除任何内存限制设置。 - spider
很抱歉,我在+1和-1以及再次+1方面有些混淆。Ajax脚本丢失了最后的+1。我已经加回来了。对于错误表示歉意。 - spider
1
修改后的问题标题已经解释了这一点。问题不是“如何增加限制”,而是“为什么会用完”。没有理由地增加限制只会导致另一个错误和服务器故障。在回答问题之前,必须阅读整个问题,而不仅仅是一些关键词,然后开始编写自动化答案。 - Your Common Sense
@Col.Shrapnel 你说得没错,但我也给了他另一个解决方案。无论如何,谢谢,下次我会考虑的。我已经适当地编辑了答案。 - Nasreddine
1
@Nacereddine,我在写下面的评论时已经把它删除了 :) - spider
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接