我应该取消设置我的PHP数组值吗?

时间:2013-05-09 10:05:18

标签: php arrays pointers memory garbage-collection

数组值上的垃圾收集是否像普通变量上的垃圾收集一样工作?

即。将完整的$数组保存在内存中,直到每个数组键都未设置或整个数组不再有指针, OR 如果不再有数组键,PHP将清理内存引用它?

我想我要问的是PHP是否将数组作为单个变量垃圾处理,或者是数组的实际部分。

很难解释我的问题,希望这对某人有意义:)

我的问题的原因是我将一个可能很大的结果集从SQL转换为一个PHP对象数组,然后过滤这个数组。我可能会根据我在这里得到的答案来改变我的过滤功能。

1 个答案:

答案 0 :(得分:2)

如果您知道他们使用大量内存(如巨大的图像或大SQL查询结果),那么开始取消设置变量是一个好主意,但前提是您确定不再需要这些信息,并且如果您PHP抱怨没有足够的内存。或者你的网络服务器。在一块仍然使用的内存中间释放微小的内存部分是没用的。它不会被重复使用。重新排序记忆会吃掉表现。 PHP在处理变量时非常优化。

如果没有其他引用指向该值,则取消设置变量将释放它的内存。对于数组也是如此:所有数组键都是对它们的值的引用,如果它们是唯一的,则取消设置数组本身将取消设置内部的所有存储值。

您应该知道查询结果完全存储在内存中。您无法直接访问它,但有mysqli_result::data_seek()等功能可让您指向要阅读的条目,下次拨打mysqli_result::fetch_assoc()即可获取该条目。

如果您确实将结果复制到数组中,那么在删除查询结果(显式调用mysqli_result::free()或通过取消设置结果对象)之前,至少会将内存消耗增加一倍。 / p>

然而,你也可以创建一个围绕mysqli_result的包装器来实现ArrayAccess接口(可能还有IteratorCountable)。这是你的阵列 - 没有复制。对随机值的访问首先会调用seek(),然后调用fetch_assoc(),然后返回值。

然后您可以自由使用所有SPL类。想要在使用foreach运行结果时过滤结果?实现自己的FilterIterator,将结果包装器放在里面,然后就可以了。