如何在PHP中捕获递归失控脚本?

如何在PHP中捕获递归失控脚本?,php,apache,recursion,Php,Apache,Recursion,我的Apache有时会因为内存不足而被杀死。这种情况过去没有发生过。我在这个项目中有几百个PHP文件 我怀疑是无意中创建了一个递归——不仅仅是一个调用自身的函数,还有一个调用B的函数a,然后B再次调用a 我试着阅读代码并找到这样的递归,但没有成功 有没有一种方法可以让PHP跟踪所有递归,或者在其内部堆栈超过一定大小时抛出警告 我的Apache有时会因为内存不足而被杀死 这至少是一个开始。我可以从你的问题中看出你怀疑这是由PHP脚本引起的 要找出哪一个,您需要进一步查看。我可以想到的一种方法是启用

我的Apache有时会因为内存不足而被杀死。这种情况过去没有发生过。我在这个项目中有几百个PHP文件

我怀疑是无意中创建了一个递归——不仅仅是一个调用自身的函数,还有一个调用B的函数a,然后B再次调用a

我试着阅读代码并找到这样的递归,但没有成功

有没有一种方法可以让PHP跟踪所有递归,或者在其内部堆栈超过一定大小时抛出警告

我的Apache有时会因为内存不足而被杀死

这至少是一个开始。我可以从你的问题中看出你怀疑这是由PHP脚本引起的

要找出哪一个,您需要进一步查看。我可以想到的一种方法是启用PHP错误日志记录。然后将设置为较低的值,以便在发生大量内存消耗时引发错误。您可以在错误日志中找到发生这种情况的行(另请参见)

这应该给你一些潜在的地方

我不确定递归是否一定会导致这种情况,你自己写的只是假设。要检测递归,可以使用xdebug并限制递归深度:

xdebug.max_nesting_level=<your preferred value>
xdebug.max\u嵌套级别=
这也会在错误日志中为您提供更多有用的信息

如果内存和递归都不是这种情况,那么它可能与PHP或PHP segaults无关,并且您的Web服务器无法处理这种情况。例如,不知道
mod_php
如何处理segfaults,但是您还没有指定要使用的SAPI


然而,PHP错误的典型来源是在触发pcre递归限制之前将PHP踢出的正则表达式。如果您在代码中使用正则表达式,您可以将其设置为一个较低的值,如,并测试是否有帮助。然而,从你的问题来看,还不清楚这是否是一个原因。因此,您首先需要了解更多信息。

您可以使用xdebug获取信息,然后检查哪个函数需要最长时间才能完成。如果你有一个无限递归函数,它会出现在列表的顶部,你就会被通缉。我已经试过了,但是如果操作系统杀死apache进程,xdebug不会记录anything@Mikhail:您在PHP中使用哪种SAPI?CGI/FCGI/mod_php?php_sapi_name()的输出:apache2handler