我很好奇在任何地方使用unset()
语言构造,我记忆或声明一些变量(无论结构如何)。
我的意思是,当有人声明变量时,它应该何时留给 GC ,或者是unset()
?
示例1:
<?php
$buffer = array(/* over 1000 elements */);
// 1) some long code, that uses $buffer
// 2) some long code, that does not use $buffer
?>
$buffer
可能会影响第2点的效果?unset($buffer)
?
醇>
示例2:
<?php
function someFunc(/* some args */){
$buffer = new VeryLargeObject();
// 1) some actions with $buffer methods and properties
// 2) some actions without usage of $buffer
return $something;
}
?>
unset($buffer)
的{{1}}内进行someFunc()
?
GC
范围内,someFunc()
将释放所有已分配的内存(包括引用和对象),当函数结束或找到return
语句时?我对技术解释很感兴趣,但也欢迎代码风格的建议。
感谢。
答案 0 :(得分:1)
在php中,脚本完成后会清理所有内存,大部分时间都足够了。
来自php.net:
unset()正如它的名字所说 - 取消设置一个变量。它不是 迫使立即释放内存。 PHP的垃圾收集器会做到这一点 当它看到拟合时 - 尽快意图,因为那些CPU周期不是 无论如何,或者在脚本耗尽之前 记忆,无论先发生什么。
如果你正在做$ whatever = null;然后你正在重写变量 数据。您可能会更快地释放/缩小内存,但它可能会窃取CPU 从真正需要它们的代码中循环出来,产生一个 更长的总执行时间。
实际上你会使用unset()
清理内存非常罕见,这篇文章中描述的很好:
https://stackoverflow.com/a/2617786/1870446
通过对变量执行unset()
,可以将变量标记为“垃圾回收”,因此内存不会立即可用。变量不再具有数据,但堆栈仍保持较大的尺寸
在PHP&gt; = 5.3.0中,您可以调用gc_collect_cycles()
强制GC传递。 (首先执行gc_enable()
)
但你必须明白PHP是脚本语言,它不是Java所以你不应该把它当作一个。如果你的脚本真的那么重,使用大量的RAM - 你可以使用unset,当脚本接近超过内存时 - GC将触发并清理一切无用的东西,包括你未设置的变量。但在大多数情况下,你可以忘掉它
此外,如果您想要取消设置您不使用的每个变量 - 请不要。它实际上会使你的脚本执行更长时间 - 通过使用更多的CPU周期 - 以获得在大多数情况下永远不需要的空闲内存。
有些人还说他们使用unset
明确表明他们不再使用变量了。我觉得这也是一个不好的做法,对我而言,只是让所有这些无用的unsets更加冗长。