当PHP请求结束时,所有内存是否都被释放?

5
在 PHP 中,我的脚本运行时分配的所有内存是否都会在页面请求结束时释放,或者我需要担心随着时间推移而积累的内存泄漏?

PHP在请求结束时会释放所有内存。它不会泄漏内存。但是,您的脚本可能会达到memory_limit,但这是另一回事了。 - mishmash
5个回答

4
不需要手动释放(调用unset())资源。PHP会自动执行此操作。在请求生命周期结束时,所有内容都将被释放。因此,您不需要担心这个问题。如果您这样做:
<?php
$resource = allocate_heavy_resource();
?>
$resource会在请求结束时被释放,因此这不会造成内存泄露。如果发生了内存泄漏,则意味着PHP存在严重的Bug,任何关于正常操作的讨论都将无效。

编辑: 当然也有例外情况,比如持久化数据库连接。但这些连接最终会被处理,因此这并不算是内存泄漏


1

是的,在您的脚本终止后,所有内存都会被释放。但是,在您的脚本中,基于某些算法可能会发生内存泄漏。您可以使用unset()来释放变量,但与vanneto的观点相反,它实际上不会释放内存


@ta.speot.is - 在这种情况下,如果您有一个旨在在请求之间保持持久性的缓存,则它不会在每个请求之后释放...会话文件和APC是明显的例子,或者持久性数据库连接也会被保留“打开”。 - Mark Baker
是的,但创建缓存并不意味着现在会创建内存泄漏,不是吗? - mishmash
1
@ta.speot.is 内存并不等同于缓存。 - NobleUplift
@NobleUplift的问题是:在PHP中,运行我的脚本所分配的所有内存是否都会在页面请求结束时释放...?因此,该错误不适用。 - mishmash
正如我所说,我知道现在已经修复了,但这是一个最好的算法性质的内存泄漏示例。 - NobleUplift
显示剩余9条评论

1

PHP会释放通过构建对象等方式声明的内存。但仍有一些情况下内存不会被释放。因此,在5.3版本中引入了垃圾回收机制。

您可以使用gc_enable()函数来执行它。在PHP中,默认情况下不启用垃圾回收。


你的意思是说,存在这样一种情况,我在一个请求中分配了一个资源,它会持续到第二个请求中吗?请给我看一个例子。 - mishmash
我并没有看到你将能够在另一个请求中使用内存。我说过它并不总是被释放,而且肯定不会立即释放。如果你需要共享内存,你应该使用其他工具(例如,我推荐使用APC进行缓存)。 - user1914292

1
有点相关,内存泄漏发生在缓存时。因此,如果您的php脚本中存在内存泄漏,则apache进程会随着时间的推移增加,您可以在多个请求之后重新启动它们。检查您的多处理模块(MPM),通常是prefork或worker。
不过,在大多数情况下,这不会对您产生太大影响,除非您正在使用PHP进行大量处理。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接