12

我有两个简单的问题。什么对内存清理更好/有用。

$var = null;

或者

unset($var);

我有一个功能,一个周期。我得到(几分钟后)

Fatal error: Allowed memory size of 419430400 bytes exhausted

我正在设置 null 和 unset()-ing 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出正在消耗内存的内容。

那么循环中的函数调用呢?PHP 会释放这些函数中的所有分配吗?(调用后)

4

5 回答 5

4

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

?>
于 2010-08-05T09:10:44.153 回答
2

unset() 就是这样做的,它取消设置一个变量;但它不会立即释放内存。

PHP 的垃圾收集器实际上会释放以前由现在未设置的变量使用的内存,但仅在它运行时才会释放。这可能会更快,当 CPU 周期没有被积极地用于其他工作时,或者在脚本内存不足之前......无论哪种情况先发生。

请注意,如果您对某个变量有其他引用,则 unset 不一定会释放该变量使用的内存。它将简单地删除引用,并将实际存储数据的引用计数减少 1。

编辑 虽然 unset 不会立即释放使用的内存(实际上只有垃圾收集会这样做),但不再使用的内存可用于声明新变量

于 2010-08-05T09:25:07.557 回答
2

我发现了问题。

首先它是由xdebug分析工具引起的(我已经打开了所有东西:)) - 它消耗了大量内存。

所以请记住:xdebug(当 profilling 打开时)在你的应用程序的 PHP 进程中消耗一些内存

其次,我没有释放被调用函数中使用的静态成员。

于 2010-08-05T13:20:15.723 回答
1

如果您取消设置它只是标记的变量,那么在下一次垃圾收集时它将被删除。如果设置为 null,则变量的数据将被覆盖。

也许还可以查看 php 手册上的评论:Unset Manual

至少这种行为也是我迄今为止遇到的。但要修复它,您应该首先尝试找出导致内存增长的原因。memory_get_usage函数应该对此有所帮助

于 2010-08-05T09:36:03.593 回答
0

And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

一旦执行离开函数的范围,所有非静态变量都会从内存中删除。

于 2010-08-05T08:49:34.780 回答