4

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

即完整的 $array 是否会保存在内存中,直到每个数组键都未设置或整个数组不再有指向它的指针,或者如果不再有对它的引用,PHP 是否会清理数组键的内存?

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

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

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

4

1 回答 1

2

如果您知道变量使用大量内存(例如巨大的图像或大型 SQL 查询结果),那么开始取消设置变量是个好主意,但前提是您确定不再需要该信息,并且您的 PHP 抱怨没有足够的内存。或者你的网络服务器。在一块仍在使用的内存中间释放一小部分内存是没有用的。它不会被重复使用。重新排序内存会消耗性能。PHP 在处理变量方面进行了相当优化。

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

您应该知道查询结果完全存储在内存中。你不能直接访问它,但是有像mysqli_result::data_seek()这样的函数可以让你指向你想要阅读的条目,下一次调用mysqli_result::fetch_assoc()就会得到它。

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

但是,您也可以围绕实现ArrayAccess接口(可能还有IteratorCountable )的 mysqli_result 创建一个包装器。这是您的数组 - 无需复制。对随机值的访问将首先调用seek(), 然后fetch_assoc(), 并返回该值。

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

于 2013-05-09T10:24:44.817 回答