我目前正在调试一个经常遇到 OutOfMemory 异常的脚本。它作为 cronjob 运行并且通常运行良好,但是当 cronjob 有一段时间没有运行时(无论出于何种原因)脚本必须处理许多排队的元素并将遇到 OutOfMemory 异常。
通过检查代码,我无法发现问题。我相信其中一个迭代函数调用可能会泄漏内存,但我不确定是哪一个以及在哪里。 当发生 OutOfMemory 异常时,是否可以选择让 PHP 转储堆?我也许可以从那里发现问题(很有可能)。
最佳答案
虽然我找不到“异常时转储堆”选项,但我确实找到了 get_defined_vars()
如果从全局范围调用,它基本上是一个堆转储。使用它,我能够看到在我的内存中有数百(实际上是数千)个仍然引用的数据库行。这是由于导致泄漏的臭名昭着的函数中某处未释放 mysql 结果资源。我找到它并修复了它。现在运行良好。
关于php - 在 OutOfMemory 异常时让 PHP 转储堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4014250/