我有两个简单的问题。什么对内存清理更好/有用。
$var = null;
或者
unset($var);
我有一个功能,一个周期。我得到(几分钟后)
Fatal error: Allowed memory size of 419430400 bytes exhausted
我正在设置 null 和 unset()-ing 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出正在消耗内存的内容。
那么循环中的函数调用呢?PHP 会释放这些函数中的所有分配吗?(调用后)
我有两个简单的问题。什么对内存清理更好/有用。
$var = null;
或者
unset($var);
我有一个功能,一个周期。我得到(几分钟后)
Fatal error: Allowed memory size of 419430400 bytes exhausted
我正在设置 null 和 unset()-ing 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出正在消耗内存的内容。
那么循环中的函数调用呢?PHP 会释放这些函数中的所有分配吗?(调用后)
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
?>
unset() 就是这样做的,它取消设置一个变量;但它不会立即释放内存。
PHP 的垃圾收集器实际上会释放以前由现在未设置的变量使用的内存,但仅在它运行时才会释放。这可能会更快,当 CPU 周期没有被积极地用于其他工作时,或者在脚本内存不足之前......无论哪种情况先发生。
请注意,如果您对某个变量有其他引用,则 unset 不一定会释放该变量使用的内存。它将简单地删除引用,并将实际存储数据的引用计数减少 1。
编辑 虽然 unset 不会立即释放使用的内存(实际上只有垃圾收集会这样做),但不再使用的内存可用于声明新变量
我发现了问题。
首先它是由xdebug分析工具引起的(我已经打开了所有东西:)) - 它消耗了大量内存。
所以请记住:xdebug(当 profilling 打开时)在你的应用程序的 PHP 进程中消耗一些内存
其次,我没有释放被调用函数中使用的静态成员。
如果您取消设置它只是标记的变量,那么在下一次垃圾收集时它将被删除。如果设置为 null,则变量的数据将被覆盖。
也许还可以查看 php 手册上的评论:Unset Manual
至少这种行为也是我迄今为止遇到的。但要修复它,您应该首先尝试找出导致内存增长的原因。memory_get_usage函数应该对此有所帮助。
And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)
一旦执行离开函数的范围,所有非静态变量都会从内存中删除。