数组值上的垃圾收集是否像普通变量上的垃圾收集一样工作?
即。将完整的$数组保存在内存中,直到每个数组键都未设置或整个数组不再有指针, OR 如果不再有数组键,PHP将清理内存引用它?
我想我要问的是PHP是否将数组作为单个变量垃圾处理,或者是数组的实际部分。
很难解释我的问题,希望这对某人有意义:)
我的问题的原因是我将一个可能很大的结果集从SQL转换为一个PHP对象数组,然后过滤这个数组。我可能会根据我在这里得到的答案来改变我的过滤功能。
答案 0 :(得分:2)
如果您知道他们使用大量内存(如巨大的图像或大SQL查询结果),那么开始取消设置变量是一个好主意,但前提是您确定不再需要这些信息,并且如果您PHP抱怨没有足够的内存。或者你的网络服务器。在一块仍然使用的内存中间释放微小的内存部分是没用的。它不会被重复使用。重新排序记忆会吃掉表现。 PHP在处理变量时非常优化。
如果没有其他引用指向该值,则取消设置变量将释放它的内存。对于数组也是如此:所有数组键都是对它们的值的引用,如果它们是唯一的,则取消设置数组本身将取消设置内部的所有存储值。
您应该知道查询结果完全存储在内存中。您无法直接访问它,但有mysqli_result::data_seek()等功能可让您指向要阅读的条目,下次拨打mysqli_result::fetch_assoc()
即可获取该条目。
如果您确实将结果复制到数组中,那么在删除查询结果(显式调用mysqli_result::free()
或通过取消设置结果对象)之前,至少会将内存消耗增加一倍。 / p>
然而,你也可以创建一个围绕mysqli_result的包装器来实现ArrayAccess接口(可能还有Iterator和Countable)。这是你的阵列 - 没有复制。对随机值的访问首先会调用seek()
,然后调用fetch_assoc()
,然后返回值。
然后您可以自由使用所有SPL类。想要在使用foreach运行结果时过滤结果?实现自己的FilterIterator,将结果包装器放在里面,然后就可以了。