【问题标题】:Differences between $var = null and unset($var) [duplicate]$var = null 和 unset($var) 之间的区别 [重复]
【发布时间】:2012-08-02 02:08:56
【问题描述】:

可能重复:
What's better at freeing memory with PHP: unset() or $var = null

就垃圾回收而言,在任何情况下 1 是否都比另一个好?

编辑: 特别是如果 $var 是一个非常大的变量,具有很多级别的递归和其他对象(与递归清理大对象有关)

编辑: 删除了这个: 我只能想到一件事,那就是isset($var) 在任何一种情况下都会做出不同的反应。

因为显然我弄错了......他们的反应相同。

【问题讨论】:

  • 与弱引用有关。变量本身实际上永远不会“超出范围”,它只需要在它变为无效时进行清理。
  • 这是一个很棒的补充...高性能应用非常需要。
  • 否,但它提供了类似缓存的功能。基本上,您加载了很多(数百万)对象,并使用弱引用保持缓存最重要的内容......这样,如果变量在某个范围内,它将引用保存在缓存中。如果没有,则可以免费收集。当包含的 var 超出范围时,我需要删除引用对象。
  • 虽然只有 1 个线程,但您可以拥有非常复杂的对象层次结构。如果您加载图像数据并将其存储在某个类中,那么您真的只想缓存它,只要它已经在内存中(其他任何东西都是浪费)。弱引用对于超大规模应用程序中的超大数据非常重要。

标签: php


【解决方案1】:
unset($var);
// You will get Undefined variable Notice.
if ($var) {}

$var = null;
// it's ok.
if ($var) {}

增加php的GC。

PHP 的垃圾回收是基于refcountrefcount,如果refcount 变为0,那么zval 可以被释放。

所以如果$a = $b = array(/*a very large array*/);,仅取消设置$a 或仅$b 不会释放大数组的内存。

unset($a);$a = null 或为$a 分配另一个值都会让refcount 减1,但只有当refcount 减为0 时才会释放内存。

【讨论】:

    【解决方案2】:

    unset 不会强制立即释放内存,而是将其留给 gc。 $var = null; 然而强制立即释放内存。

    参见示例:

     // $a = NULL; (better I think)
     $a = 5;
     $b = & $a;
     $a = NULL;
     print "b $b "; // b 
     print(! isset($b)); // 1 
     ?>
    

    还值得注意的是,在数组的情况取消设置destroys变量完全地。即:

    <?php
    $ar = array(1,2,3,4);
    var_dump($ar);
    echo "<br />";
    
    unset($ar[2]);
    var_dump($ar);
    echo "<br />";
    
    $ar[1] = null;
    var_dump($ar);
    ?>
    

    返回输出:

    array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
    array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) } 
    array(3) { [0]=> int(1) [1]=> NULL [3]=> int(4) }
    

    【讨论】:

    • 我希望我可以为解决方案选择多个答案...由于我只能选择 1,这基本上就是我想要的。对于未来的读者,RiaD 和 xdazz 的答案也为其他用例提供了非常有用的信息。 Xdazz 确实在解释 GC 内部结构方面付出了更多努力;)
    • 该示例如何演示有关“强制”垃圾收集器的任何内容?!
    【解决方案3】:
    $a = 5;
    $b = &$a;
    unset($b); //just say $b should not pointer to any var
    print $a; // 5
    
    
    $a = 5;
    $b = &$a;
    $b = null;
    print $a; // nothing, because $a = null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-04
      • 2013-02-19
      • 2019-03-29
      • 2017-01-21
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多