我意识到第二种方法避免了函数调用的开销(更新,实际上是一种语言构造),但知道其中一种方法是否比另一种更好会很有趣。我的大部分代码都使用unset(),但最近我在网上找到了一些使用$var = null的体面类。
是否有一个首选的,理由是什么?
我意识到第二种方法避免了函数调用的开销(更新,实际上是一种语言构造),但知道其中一种方法是否比另一种更好会很有趣。我的大部分代码都使用unset(),但最近我在网上找到了一些使用$var = null的体面类。
是否有一个首选的,理由是什么?
当前回答
对于对象,特别是在惰性加载场景中,应该考虑垃圾收集器运行在空闲的CPU周期中,因此假设您遇到了麻烦,当大量对象加载时,小时间惩罚将解决内存释放问题。
使用time_nanosleep使GC能够收集内存。 将变量设置为null是可取的。
在生产服务器上测试,最初作业消耗50MB,然后停止。 在使用nanosleep之后,14MB的内存消耗是不变的。
有人会说,这取决于GC行为,而GC行为可能会随着PHP版本的不同而变化。 但它在PHP 5.3上运行良好。
如。此示例(代码取自VirtueMart2谷歌提要)
for($n=0; $n<count($ids); $n++)
{
//unset($product); //usefull for arrays
$product = null
if( $n % 50 == 0 )
{
// let GC do the memory job
//echo "<mem>" . memory_get_usage() . "</mem>";//$ids[$n];
time_nanosleep(0, 10000000);
}
$product = $productModel->getProductSingle((int)$ids[$n],true, true, true);
...
其他回答
对于对象,特别是在惰性加载场景中,应该考虑垃圾收集器运行在空闲的CPU周期中,因此假设您遇到了麻烦,当大量对象加载时,小时间惩罚将解决内存释放问题。
使用time_nanosleep使GC能够收集内存。 将变量设置为null是可取的。
在生产服务器上测试,最初作业消耗50MB,然后停止。 在使用nanosleep之后,14MB的内存消耗是不变的。
有人会说,这取决于GC行为,而GC行为可能会随着PHP版本的不同而变化。 但它在PHP 5.3上运行良好。
如。此示例(代码取自VirtueMart2谷歌提要)
for($n=0; $n<count($ids); $n++)
{
//unset($product); //usefull for arrays
$product = null
if( $n % 50 == 0 )
{
// let GC do the memory job
//echo "<mem>" . memory_get_usage() . "</mem>";//$ids[$n];
time_nanosleep(0, 10000000);
}
$product = $productModel->getProductSingle((int)$ids[$n],true, true, true);
...
我仍然怀疑这一点,但我已经在我的脚本中尝试过,我正在使用xdebug来了解它将如何影响我的应用程序内存使用。 脚本是这样设置在我的函数:
function gen_table_data($serv, $coorp, $type, $showSql = FALSE, $table = 'ireg_idnts') {
$sql = "SELECT COUNT(`operator`) `operator` FROM $table WHERE $serv = '$coorp'";
if($showSql === FALSE) {
$sql = mysql_query($sql) or die(mysql_error());
$data = mysql_fetch_array($sql);
return $data[0];
} else echo $sql;
}
我在返回代码前添加了unset它给我160200 然后我尝试用$sql = NULL更改它,它给我:160224:)
但有一些独特的比较,当我不使用unset()或NULL, xdebug给我160144作为内存使用量
所以,我认为给line使用unset()或NULL将添加进程到您的应用程序,它将更好地保持原点与您的代码和减少变量,你正在使用尽可能有效。
如果我说错了请指正,谢谢
在2009年的unset手册页面中提到:
unset() does just what its name says - unset a variable. It does not force immediate memory freeing. PHP's garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren't needed anyway, or as late as before the script would run out of memory, whatever occurs first. If you are doing $whatever = null; then you are rewriting variable's data. You might get memory freed / shrunk faster, but it may steal CPU cycles from the code that truly needs them sooner, resulting in a longer overall execution time.
(自2013年起,未设置的手册页不再包括该部分)
注意,在php5.3之前,如果循环引用中有两个对象,例如在父子关系中,在父对象上调用unset()将不会释放用于子对象中父引用的内存。当父对象被垃圾回收时,内存也不会被释放。
问题“unset和= 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()对手快一点:更新符号表项似乎比删除它快。
当您尝试使用不存在(未设置)变量时,将触发一个错误,变量表达式的值将为null。(因为,PHP还应该做什么?每个表达式都需要产生某个值。) 一个赋值为null的变量仍然是一个完全正常的变量。
Unset实际上不是一个函数,而是一种语言结构。与其说它是一个函数调用,不如说它是一个return或include。
除了性能问题,使用unset可以使代码的意图更加清晰。
如果没有释放即时内存,则取消设置代码仍然是非常有用的,并且每次在退出方法之前传递代码步骤时都这样做是一个很好的实践。请注意,这不是关于释放即时内存。 直接内存是CPU的,辅助内存是RAM。
这也解决了防止内存泄漏的问题。
请参阅此链接 http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2
我使用unset已经很长时间了。
更好的做法是在代码中立即取消所有已经作为数组使用的变量。
$data['tesst']='';
$data['test2']='asdadsa';
....
nth.
只需要unset($data);释放所有变量的使用。
请参阅相关主题取消设置
在PHP中取消变量设置有多重要?
(错误)