PHP在单个请求中分配的内存是否总是在最后发布?

时间:2011-09-17 16:51:17

标签: php memory-management memory-leaks

我对PHP中的内存泄漏感到有点困惑。

我已经读过,由于Zend Memory Manager,PHP会自动释放每个请求中使用的内存: http://www.webreference.com/programming/php_mem/2.html

但是我看到很多人和主题(即使在这里也是如此)关注PHP和内存泄漏。

所以我觉得我失去了一些东西。

在不同请求之间是否可能在PHP中发生内存泄漏?

1 个答案:

答案 0 :(得分:8)

不可能在不同的请求之间(当使用默认的Apache配置时)从PHP脚本中泄漏内存,因为在该请求结束时释放一个请求中使用的变量和代码,并且PHP的内存分配器重新启动下一个请求。但是,PHP解释器或扩展中的错误可能会单独泄漏内存。

更大的问题是Apache子进程内部有PHP的内存空间。他们膨胀以分配PHP脚本的峰值内存使用量,然后保持这个内存分配,直到子进程被终止(一旦进程要求内核分配一部分内存,该内存将不会被释放,直到进程终止)。如需更详细地解释为什么这是一个问题以及如何解决它,请参阅Server Fault上的答案。

脚本中的内存泄漏,其中变量未被设置且PHP垃圾收集器失败,这是非常罕见的 - 大多数PHP脚本运行几百毫秒,这通常不足以显示甚至严重的内存泄漏

您可以使用memory_get_usage()memory_get_peak_usage()监控PHP脚本使用的内存量 - 还可以很好地解释内存使用情况以及如何在PHP manual中进行防御性编程。< / p>

this article中详细解释了PHP的内存管理。

编辑您可以使用httpd -l确定已编译到Apache的模块 - 默认值因操作系统分发和存储库配置而异。有很多方法可以将PHP与Apache连接起来 - 最详细的here