我有两个简单的问题。什么对内存清理更好/有用。
$var = null;
或
unset($var);
我有一个循环的功能。我得到(几分钟后)
Fatal error: Allowed memory size of 419430400 bytes exhausted
我设置null并取消设置() - 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出消耗内存的内容。
那么循环中的函数调用呢? PHP会在这些函数中释放所有分配吗?(通话后)
答案 0 :(得分:5)
PHP本身有时会混淆这两个概念,但一般来说,设置为NULL的变量与不存在的变量不同:
<?php
$foo = 'One';
$bar = 'Two';
$foo = NULL;
unset($bar);
var_dump($foo); // NULL
var_dump($bar); // Notice: Undefined variable: bar
var_dump(get_defined_vars()); // Only foo shows up: ["foo"]=> NULL
?>
答案 1 :(得分:2)
unset()就是这样,它取消了一个变量;但它没有立即释放记忆。
PHP的垃圾收集器实际上将释放以前由未设置的变量使用的内存,但仅限于运行时。这可能会更快,当CPU周期没有被主动用于其他工作时,或者在脚本运行内存不足之前......无论哪种情况首先发生。
请注意,如果您对该变量有其他引用,则unset不一定会释放变量使用的内存。它将简单地删除引用,并将实际存储数据的引用计数减少1.
修改强> 虽然unset没有立即释放所使用的内存(只有垃圾收集实际上这样做),不再用作结果的内存可用于声明新变量
答案 2 :(得分:2)
我发现了问题。
首先它是由 xdebug profilling工具引起的(我打开了所有东西:)) - 它消耗了大量内存。
请记住:xdebug(打开profilling时)会在应用程序的PHP进程中占用一些内存
其次,我没有发布在被调用函数中使用的静态成员。
答案 3 :(得分:1)
如果你取消设置变量,它只是标记,所以在下一个垃圾收集它将被删除。如果设置为null,则变量的数据将被覆盖。
也许还可以参阅php手册上的评论:Unset Manual
至少这种行为也是我到目前为止所遇到的。 但要解决它,你应该首先尝试找出导致内存增长的原因。 memory_get_usage函数应该对此有所帮助。
答案 4 :(得分:0)
And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)
执行离开函数范围后,所有非静态变量都将从内存中删除。