PHP为对象数组清除内存

时间:2016-06-24 17:35:19

标签: php arrays memory-management

我有一个类,其中包含一个从另一个类实例化的简单对象数组。 (这个数组很小 - 只包含1到4个对象。)

在第一个类的__destruct方法中,我想清除这个对象数组的内容(释放内存)。为此,请做:

  1. 遍历数组,设置每个index = null,然后最后设置array = null?

  2. 只需设置array = null?

2 个答案:

答案 0 :(得分:0)

正如@ splash58已经提到的,您可以使用unset删除变量。

unset($array); // can be used on multiple as well: unset($var1, $var2, ...);

取消设置只会破坏变量。

答案 1 :(得分:0)

Re:rjdown链接。谢谢。我以前读过那个问题/答案。

从那篇文章中我得出结论(可能是错误的)unset($ var)和$ var = null之间似乎存在2个(可能的?)差异。

  1. 实际释放内存的速度。 ($ var = null似乎更快。)

  2. 该方法的处理负荷。 (未设置($ var)似乎表示负载较少。)

  3. 由于原因,我决定了内存释放的速度,因此使用了空赋值。

    然而,问题仍然存在 - 数组将为null,但数组先前包含的对象是否为非null,因此必须等待GC?

    由于测试实际上很容易,我做到了。

    我为父类创建了大约1,000个子记录。然后我实例化了一个新的父类,并将1,000个子对象加载到数组中。

    我在测试文件中使用了memory_get_usage(),并运行了多个试验:

    1. 父母班级' __destruct方法只是取消设置子对象数组。

    2. 父母班级' __destruct方法遍历数组,设置每个instance = null,然后取消设置数组。

    3. 数据如下:

      • 使用parent __destruct unset array

      启动内存 - 620288

      父实例和子数组加载后的

      内存 - 1316952

      父级设置为null后的

      内存 - 620864

      mem diff = 576

      • 使用parent __destruct iterate array = null

      启动内存 - 620952

      父实例和子数组加载后的

      内存 - 1317616

      父级设置为null后的

      内存 - 621528

      mem diff = 576

      (我还在父对象创建,子数组加载,父对象破坏之间设置了微时间间隔。对于每个2 __destruct方法的测试在10毫秒左右基本相同。)

      从此我得出结论 - 确实没有多大区别。取消或无效,无论你的船是什么漂浮。

      (也许我应该在用问题打扰论坛之前简单地运行我自己的测试。)

      再次,谢谢。