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。 另外,我会避免将结束 ?&gt; 分隔符放入 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)的主要内容,如果未能解决你的问题,请参考以下文章

避免android片段中内存泄漏的最佳方法是啥

进行 AppEngine 模型内存缓存的最佳方法是啥?

在用 Actionscript 和 MXML 编写的 Flex 程序中调试内存泄漏的最佳方法是啥?

使用 python 3.6 将多个文件并行加载到内存中的最佳方法是啥?

在 WPF PRISM/MVVM 应用程序中避免内存泄漏的最佳方法是啥

在 Linux 上防止内存不足 (OOM) 冻结的最佳方法是啥?