【发布时间】:2013-05-09 13:30:20
【问题描述】:
我对使用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 点的性能? - 在进入第 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;
}
?>
- 在进入第 2 点之前,我真的需要(或应该)在
someFunc()s 的正文中执行unset($buffer)吗? - 当函数结束或找到
return语句时,GC会在someFunc()s 范围内释放所有分配的内存(包括引用和对象)吗?
我对技术解释很感兴趣,但也欢迎代码风格的建议。
谢谢。
【问题讨论】:
-
完成后取消设置任何变量并没有错,但是对于像这样的大对象,我肯定会说。我确信在第 2 部分中运行的代码会享受额外的空间。
-
@Orangepill 我也这么认为,但一些程序员(在我的工作岗位上)认为,没有必要这样做,因为“PHP 有 GC !!”。例如,很多 Symfony 核心对象都是 LARGE,但它们存在于方法中。它们是否应该在完成后取消设置,而不是等待函数结束?此外,他们提到“
php_memory_limit足够大”以忽略unset(),无论如何 PHP 都会这样做。 -
unset将释放内存 only when the object (not variable) is no longer referenced。 GC 将very slightly decrease performance。但总的来说,取消设置不再使用的变量并没有错。 -
@Passerby 谢谢,我会在进一步的编码中考虑它。
标签: php performance memory-management garbage-collection unset