什么时候应该使用unset()?

时间:2013-05-15 05:00:44

标签: php performance memory-management garbage-collection unset

我很好奇在任何地方使用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
?>
  1. 是否有可能$buffer可能会影响第2点的效果?
  2. 在进入第2点
  3. 之前,我是否真的需要(或应该)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;
    }
    ?>
    
    1. 在进入第2点
    2. 之前,我是否真的需要(或应该)在unset($buffer)的{​​{1}}内进行someFunc()
    3. GC范围内,someFunc()将释放所有已分配的内存(包括引用和对象),当函数结束或找到return语句时?

    4.   

      我对技术解释很感兴趣,但也欢迎代码风格的建议。

      感谢。

1 个答案:

答案 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更加冗长。