【问题标题】:Does PHP free local variables immediately after the function ends?PHP 是否在函数结束后立即释放局部变量?
【发布时间】:2012-12-14 12:10:45
【问题描述】:

代码更好地说明了我的要求:

function foo(){

  $var = get_huge_amount_of_data();

  return $var[0];
}


$s = foo();

// is memory freed here for the $var variable created above?

do_other_stuff(); // need memory here lol

所以我知道 $var 在某些时候会被释放,但是 PHP 能有效地做到这一点吗?还是我需要手动取消设置昂贵的变量?

【问题讨论】:

  • 有效地 - 你不能这样问。您认为 有效 的内容可能有所不同(很可能是您询问 BTW 的方式)在 PHP 中实际上 有效。
  • 好吧,我的意思是,一旦很明显该变量将不再被使用,就立即执行。
  • 甚至更早。随着函数的结束,所有本地变量都消失了。数据是否(暂时)留在内存中并不重要。但是要知道你需要更多地了解内存管理,我想这不是你的强项(请不要冒犯)。立即从系统中取消分配内存块的成本太高,只是因为不再使用局部变量。

标签: php memory


【解决方案1】:

是的,它确实被释放了。

您可以通过以下方式检查:

function a() {
    $var = "Hello World";
    $content = "";
    for ($i = 0; $i < 10000; $i++) {
        $content .= $var;
    }
    print '<br>$content size:'.strlen($content);
    print '<br>memory in function:'.memory_get_usage();
    return null;
}

print '<br>memory before function:'.memory_get_usage();
a();
print '<br>memory after function:'.memory_get_usage();

输出:

memory before function:273312
$content size:110000
memory in function:383520
memory after function:273352

函数之前 PHP 使用了 273312 个字节。
在函数完成之前,我们再次检查了内存使用情况,它使用了 383520。
我们检查了 $content 的大小,它是 110000 字节。
273312 + 110000 = 383312
剩下的 208 字节来自其他变量(我们只计算了 $content)
函数完成后,我们再次检查内存使用情况,它恢复到(几乎(40 字节差异))和以前一样。

40 字节的差异很可能是函数声明和 for 循环声明。

【讨论】:

    【解决方案2】:

    你可以在一个类上看到这个例子,那是因为你可以在类的析构函数中“捕捉”释放一个变量:

    class a {
      function __destruct(){
        echo "destructor<br>";
      }
    }
    
    function b(){ // test function
      $c=new a();
      echo 'exit from function b()<br>';
    }
    
    echo "before b()<br>";
    b();
    echo "after b()<br>";
    
    die();
    

    此脚本输出:

    before b()
    exit from function b()
    destructor
    after b()
    

    所以现在很明显变量在函数退出时被销毁了。

    【讨论】:

    • 但是,这不适用于主范围。您还可以在主脚本中设置一个对象变量并查看它何时被销毁 - 即使您之前显式调用了它的析构函数,它也会一直保留到die 结束!
    【解决方案3】:

    是的,因为$var 在堆栈上声明,一旦超出范围就会被清除

    你可以参考这个https://stackoverflow.com/a/5971224/307157

    【讨论】:

    • 我在该链接中完全看不到任何内容,甚至暗示您所说的内容。该页面专门关于语义。还有其他参考吗? -1 现在。
    【解决方案4】:

    所以我知道 $var 在某些时候会被释放,但是 PHP 能有效地做到这一点吗?还是我需要手动取消设置昂贵的变量?

    是的,PHP 做得很好。这是一个你永远不需要考虑的问题。在您的情况下,我宁愿考虑$var = ..return .. 之间的时刻,因为那是您无法避免内存消耗的时刻。您应该尝试找到一个解决方案,您不需要通过get_huge_amount_of_data() 获取整个数据集,然后选择单个项目,而只选择您需要的数据。

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2016-06-13
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      相关资源
      最近更新 更多