如果你使用XDebug,有一个最大的功能嵌套深度由一个
ini setting控制:
$foo = function() use (&$foo) {
$foo();
};
$foo();
产生以下错误:
Fatal error: Maximum function nesting level of ‘100’ reached, aborting!
这个IMHO是一个比segfault更好的选择,因为它只杀死当前脚本,而不是整个过程。
有几年前(2006年)在内部列表上有this thread。他的意见是:
So far nobody had proposed a solution for endless loop problem that
would satisfy these conditions:
No false positives (i.e. good code always works)
No slowdown for execution
Works with any stack size
Thus, this problem remains unsloved.
现在,#1是完全不可能解决由于halting problem.#2是微不足道如果你保持一个堆栈深度的计数器(因为你只是检查堆栈推送增加的堆栈级别)。
最后,#3是一个更难解决的问题。考虑到一些操作系统将以非连续的方式分配堆栈空间,所以不可能以100%的精度实现,因为不可能可移植地获得堆栈大小或使用(对于特定平台而言可能是可能的,甚至容易,但不是一般)。
相反,PHP应该从XDebug和其他语言(Python等)的提示,并使一个可配置的嵌套级别(Python的默认是set to 1000)….
或者,或者在堆栈上捕获内存分配错误,以检查segfault发生之前,并将其转换为RecursionLimitException,以便您可以能够恢复….