PHP中的垃圾回收是如何工作的?特别是,局部函数变量如何被清理?

4
如果我在函数内给一个没有声明为全局变量的变量赋值,那么当函数执行完毕时这个变量会自动取消定义吗?还是只有在 PHP 脚本执行完毕后才会取消定义?
我正在尝试确定手动取消函数作用域内的临时变量是否比不担心,因为它们将由 PHP 引擎自动取消定义更加明智。

尽管问题的标题中有GC,但这个问题实际上在询问何时使用unset:http://stackoverflow.com/questions/3298206/php-when-to-use-unset - webbiedave
3个回答

5

除非变量有外部引用使其保持“活着”的状态,否则在函数退出时将取消变量。变量所占用的实际内存是否释放完全取决于垃圾收集器。GC是一项昂贵的操作,PHP仅在需要时(例如内存不足)才会调用它。


1
除非我的知识已经过时,否则没有标记和扫描涉及,只有一种有趣的引用计数(有趣是因为PHP处理引用和复制的方式)。内存释放非常确定。 - Daniel Lubarov
@Daniel:这已经过时了。请参阅http://www.php.net/manual/de/features.gc.collecting-cycles.php。 - user395760
1
@daniel:5.3 版本实现了一个适当的垃圾回收器,可以打破循环引用。因此 $a = &$a; 不再会在内存中“卡住”该变量。 - Marc B

1

这完全取决于函数的范围。理论上,您可以在一个函数的范围内运行整个脚本(希望是调用其他函数的函数,但仍然...)。

对于具有最小副作用的合理大小的函数,保留对象设置是完全可以的--它们的析构函数将在函数完成时被调用(这是unset的第二个效果),并且它们将在函数完成后的第一次清理周期中进行清理。对于涉及创建大量对象的较大函数,则最好手动删除对象。


0

Zend引擎会为您进行清理,根据需要递减引用计数


引用计数不等于垃圾回收,实际上比垃圾回收更弱(它无法收集循环引用)。幸运的是,PHP自几个版本以来就有了真正的垃圾回收机制。 - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接