Windows上的PHP内存泄漏

时间:2015-06-12 06:29:16

标签: php windows azure

我们在其中一个PHP应用程序中有一些长时间运行的导入例程。在Linux上,导入顺利完成,但在Windows服务器上,脚本内存不足。 PHP中的最大内存设置在Windows框中设置为更高级别,但它仍然会崩溃。

使用PHP的内置内存使用功能进行一些调查之后,Windows实现本身可能存在问题。这些函数报告内存使用率几乎不变,每千条记录只泄漏几MB。在查看进程资源管理器时,PHP分配的内存一直在增加。看起来内存在PHP的内部结构中被释放,但在Windows中没有被释放。

有没有办法强制PHP释放未使用的进程内存?我看了一个关于PHP内存管理的演示文稿,并且有人解释说,当它们的ref-count达到0时,变量从内存中释放出来。但是,释放的内存似乎没有返回到Windows。

前进的最佳方式是什么?我想记录导入的内容,但我发现的所有PHP内存分析器都只是Linux。我错过了吗?

如果确实有所作为,那么应用程序将部署在Azure上。

2 个答案:

答案 0 :(得分:0)

在我研究这个问题时,它很可能与在IIS上运行的FCGI有关。在Apache上,PHP作为apache模块运行,除非它被明确配置为以FastCGI身份运行。在IIS上,PHP在FastCGI上运行。该问题可能是由Apache和IIS之间的差异引起的。它也可能是由两台服务器上安装的不同PHP扩展引起的。我现在还不能提供一个可靠的答案。

我还在我的Azure网站上运行了一些测试代码malloc / free内存,但无法重现泄漏的情况。我将弄清楚FastCGI如何处理内存泄漏。根据我的理解,Apache和IIS都会发生内存泄漏,如果处于可容忍的水平,则可以。是否可以获得有关正在运行的代码和PHP运行时环境的更多详细信息?这对重新解决问题非常有帮助。

答案 1 :(得分:0)

以下几项可能会有所帮助:

  1. 使用垃圾收集,检查phpinfo for zend.enable_gc,如果您在默认情况下看到它已禁用,则启用它,zend.enable_gc = 1,

  2. 降低FastCGI循环间隔,例如。 " instanceMaxRequest = 1000&#34 ;.当FastCGI实例被回收时,其所有累积的内存都被刷新,因此更短的回收期可能会有所帮助 请参阅此文档,了解如何配置FastCGI,http://www.iis.net/configreference/system.webserver/fastcgi

  3. 使用Xdebug跟踪内存使用情况,Xdebug适用于Windows,要使用它,您需要从http://xdebug.org/download.php下载适用于Windows的Xdebug扩展程序