小编典典

用 PHP 释放内存有什么好处:unset() 或 $var = null

all

我意识到第二个避免了函数调用的开销( update
,实际上是一种语言结构),但是知道一个是否比另一个更好会很有趣。我一直在使用unset()我的大部分编码,但我最近浏览了一些在网上找到的可敬的类,它们$var = null改为使用。

有没有首选的,原因是什么?


阅读 79

收藏
2022-05-18

共1个答案

小编典典

在 2009
年未设置的手册页中
提到了这一点:

unset()就像它的名字所说的那样 - 取消设置一个变量。它不会强制立即释放内存。PHP 的垃圾收集器将在它认为合适的时候执行它 -
有意尽快,因为无论如何都不需要这些 CPU 周期,或者直到脚本耗尽内存之前,无论首先发生什么。

如果您正在这样做,$whatever = null;那么您正在重写变量的数据。您可能会更快地释放/缩小内存,但它可能会更快地从真正需要它们的代码中窃取 CPU
周期,从而导致更长的整体执行时间。

(自 2013
年以来,该unset手册页不再包含该部分)

请注意,直到 php5.3,如果您在循环引用中有两个对象,例如在父子关系中,则在父对象上调用 unset()
不会释放子对象中用于父引用的内存。(当父对象被垃圾回收时,内存也不会被释放。)(错误
33595


问题“ unset and = null
之间的区别
”详细说明了一些区别:


unset($a)``$a也从符号表中删除;例如:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

输出:

Notice: Undefined variable: a in xxx
NULL

但是什么时候$a = null使用:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

输出:

NULL

它似乎$a = null比它的unset()对应物快一点:更新符号表条目似乎比删除它更快。


  • 当您尝试使用不存在的 ( unset) 变量时,将触发错误并且变量表达式的值将为空。(因为,PHP 还应该做什么?每个表达式都需要产生一些值。)
  • 但是,分配有 null 的变量仍然是一个完全正常的变量。
2022-05-18