【问题标题】:PHP memory leaks on WindowsWindows 上的 PHP 内存泄漏
【发布时间】:2015-06-12 06:29:16
【问题描述】:

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

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

有没有办法强制 PHP 释放未使用的进程内存?我观看了关于 PHP 内存管理的演示文稿,并解释说,当它们的引用计数达到 0 时,变量会从内存中释放。但是,释放的内存似乎没有返回到 Windows。

前进的最佳方式是什么?我想对导入进行内存分析,但我发现的所有 PHP 内存分析器都仅适用于 Linux。我错过了一个吗?

应用程序部署在 Azure 上,如果这确实有所不同的话。

【问题讨论】:

  • 因为在我这边重现您的问题有点困难,而且我只发现了多年前创建的错误报告:bugs.php.net/bug.php?id=11698,不确定是否是这种情况。还有其他人报告了 Linux 上的内存问题,但不是 Windows:stackoverflow.com/questions/7735378/…,请检查故障排除过程,看看是否有帮助。
  • 是的,如果没有一个好的内存分析器,很难弄清楚到底哪里出了问题。如果我碰巧有一些空闲时间,我会尝试构建一个测试用例来重现该行为。我可能会先测试 PHP 7,因为他们在更改日志中提到了很多内存改进。

标签: php windows azure


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    1. 使用垃圾回收,检查 phpinfo 中的 zend.enable_gc,如果您看到它默认禁用,请启用它,zend.enable_gc=1,

    2. 较低的 FastCGI 回收间隔,例如。 “实例最大请求 = 1000”。当一个 FastCGI 实例被回收时,它的所有累积内存都会被刷新,因此更短的回收周期可能会有所帮助。
      FastCGI的配置方法参考这篇文档http://www.iis.net/configreference/system.webserver/fastcgi

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 2023-03-17
      • 2012-04-17
      相关资源
      最近更新 更多