PHP中内存清理的最佳方法是啥? (5.2)
Posted
技术标签:
【中文标题】PHP中内存清理的最佳方法是啥? (5.2)【英文标题】:What is the best method for memory cleanup in PHP? (5.2)PHP中内存清理的最佳方法是什么? (5.2) 【发布时间】:2011-03-25 16:37:55 【问题描述】:我有两个简单的问题。什么对内存清理更好/有用。
$var = null;
或
unset($var);
我有一个功能,一个周期。我得到(几分钟后)
Fatal error: Allowed memory size of 419430400 bytes exhausted
我正在设置 null 和 unset()-ing 每个对象(在循环结束时)但仍然没有任何成功:(我无法找出消耗内存的内容。
那么循环中的函数调用呢? php 会释放这些函数中的所有分配吗?(调用后)
【问题讨论】:
您的代码是什么样的,会产生错误?也许其中一个功能是内存密集型。例如,在使用 gd 库时,我就有了它。 【参考方案1】:我发现了问题。
首先它是由 xdebug 分析工具引起的(我已经打开了所有东西 :)) - 它消耗大量内存。
所以请记住:xdebug(当 profilling 打开时)会在您的应用程序的 PHP 进程中消耗一些内存
其次,我没有发布调用函数中使用的静态成员。
【讨论】:
但这并不能回答您的问题。什么在内存方面更好,未设置或设置为 null【参考方案2】:如果您取消设置刚刚标记的变量,那么在下一次垃圾回收时它将被删除。如果设置为null,则变量的数据会被覆盖。
也许还可以查看 php 手册中的 cmets:Unset Manual
至少这种行为也是我目前遇到的。 但要修复它,您应该首先尝试找出导致内存增长的原因。 memory_get_usage 函数应该对此有所帮助。
【讨论】:
【参考方案3】:unset() 就是这样做的,它取消设置一个变量;但它不会立即释放内存。
PHP 的垃圾收集器实际上会释放以前由现在未设置的变量使用的内存,但只有在它运行时才会释放。这可能会更快,当 CPU 周期没有被积极地用于其他工作时,或者在脚本内存不足之前......无论哪种情况先发生。
请注意,如果您对某个变量有其他引用,则 unset 不一定会释放该变量使用的内存。它将简单地删除引用,并将实际存储数据的引用计数减少 1。
编辑 虽然 unset 不会立即释放使用的内存(实际上只有垃圾回收会这样做),但不再使用的内存可用于声明新变量
【讨论】:
谢谢,但是什么时候发布呢?我附上了我的代码 sn-p。当我开始运行它时,前 5 分钟后出现致命错误 400 MB 已用完.. 这都是错误的。unset
确实以与垃圾收集器相同的方式释放内存(顺便说一句,自 PHP 5.3 起才存在),即,如果变量的底层存储没有更多引用,它们会将块返回到内存分配器。跨度>
unset() 使变量使用的内存可供重用(通过减少 zval refcount),但不会释放它。当 zval refcount 为零时,Zend 引擎知道内存块可供重用。垃圾收集实际上释放了内存,有效地进行了 C free() 调用。至少这是我的理解。虽然我承认理解是基于无数相互矛盾的来源
你是对的。他们在 PHP 5.3 中所做的唯一更改是垃圾收集器现在(大概)可以处理循环引用(这在 PHP 5.2 或更低版本中不起作用,因此您可能很快就会耗尽内存,因为如果您有对象从未真正释放过循环引用)。【参考方案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
?>
【讨论】:
这种混淆主要归因于错误假设isset
是未设置的对应物。 Unset 从当前作用域中删除一个变量符号,其中 isset 还检查它是否存在且非null
。例如,isset($foo)
和 isset($bar)
在上面的示例中都会返回 false。
另外,我会避免将结束 ?>
分隔符放入 SO 上的代码块中。使代码不必要地(稍微)更难阅读。
除了这种混淆之外,实际上很难区分 NULL 和未设置。说真的:***.com/questions/2283647/…【参考方案5】:
And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)
一旦执行离开函数的作用域,所有非静态变量都会从内存中删除。
【讨论】:
谢谢,但问题是什么时候?通话后立即? 我问你是因为我知道 PHP 在这方面很愚蠢。在其他语言中,这是理所当然的。 尽快。我不想说“立即”,因为这可能并不完全正确(尤其是在我们处理资源时)以上是关于PHP中内存清理的最佳方法是啥? (5.2)的主要内容,如果未能解决你的问题,请参考以下文章
在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?
使用 python 3.6 将多个文件并行加载到内存中的最佳方法是啥?