在PHP脚本中调用unset()

mor*_*ous 9 php

来自C/C++背景,我习惯于自己做垃圾收集 - 即在使用它们之后释放资源(即C++版本中的RAII).

在使用它们之后,我发现自己未设置(主要是ORM)变量.这种习惯有什么好处吗?

我记得曾经读过一段时间,那些未设置的变量标志着它们被删除以引起PHP的注意 - 这可以帮助服务器端的资源使用 - 是真还是假?

[编辑]

我忘了提到,我使用的是PHP 5.3,而且我所做的大多数unset()调用都在一个循环中,我正在处理几个'重'的ORM变量

Ken*_*ins 6

我发现,如果你不得不unset使用很多你可能做错了.让范围为您做"不安定".考虑两个例子:

1:

$var1 = f( ... );
....
unset( $var1 );

$var2 = g( ... );
....
unset( $var2 );
Run Code Online (Sandbox Code Playgroud)

2:

function scope1()
{
     $var1 = f( ... );
     ....
} //end of function triggers release of $var1

function scope2()
{
     $var2 = g( ... );
     ....
} //end of function triggers release of $var2

scope1();
scope2();
Run Code Online (Sandbox Code Playgroud)

第二个例子我更可取,因为它清楚地定义了范围并降低了将变量泄漏到全局范围的风险(仅在脚本结束时发布).

编辑:

要记住的另一件事是unsetPHP中的成本比普通范围的垃圾收集更多(CPU).虽然差异很小,但它表明了PHP团队的重点是什么unset.如果有任何东西unset应该给PHP了解如何释放内存,但它实际上增加了执行时间.unset只是与释放那些不再需要的变量,除非你做一些相当复杂的黑客攻击,重用变量(就像一个天然unset的老变量)和范围应该是大家永远需要的.

function noop( $value ){}

function test1()
{
    $value = "something";
    noop( $value ); //make sure $value isn't optimized out
}

function test2()
{
    $value = "something";
    noop( $value ); //make sure $value isn't optimized out
    unset( $value );
}

$start1 = microtime(true);
for( $i = 0; $i < 1000000; $i++ ) test1();
$end1 = microtime(true);

$start2 = microtime(true);
for( $i = 0; $i < 1000000; $i++ ) test2();
$end2 = microtime(true);

echo "test1 ".($end1 - $start1)."\n"; //test1 0.404934883118
echo "test2 ".($end2 - $start2)."\n"; //test2 0.434437990189
Run Code Online (Sandbox Code Playgroud)


Rya*_*ney 3

如果在长脚本的早期使用非常大的对象,并且该对象没有机会超出范围,那么unset()可能有助于内存使用。在大多数情况下,对象超出范围并自动标记为 GC。