【发布时间】: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,因为他们在更改日志中提到了很多内存改进。