gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 21:12:28 25 4
gpt4 key购买 nike

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

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

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

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

我提出这个问题的原因是,我正在将一个可能很大的结果集从 SQL 转换为一个 PHP 对象数组,然后过滤这个数组。我可能会根据我在此处获得的答案在某种程度上更改我的过滤功能。

最佳答案

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

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

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

如果你真的将结果复制到一个数组,你至少会加倍你的内存消耗,直到你删除查询结果(明确地调用 mysqli_result::free(),或者通过取消设置结果对象)。

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

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

关于php - 我应该取消设置我的 PHP 数组值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16459219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com