对于我来说,这个错误消息最常见的原因是在PHP“for”语句中省略“++”运算符。这会导致循环无限继续,无论您允许使用多少内存。这是一个简单的语法错误,但很难由编译器或运行时系统检测到。如果我们想要纠正它,很容易发现它的存在!
But suppose you want a general procedure for stopping such a loop early and reporting the error? You can simply instrument each of your loops (or at least the innermost loops) as discussed below.
在某些情况下,如在异常内部进行递归时, set_time_limit
失败,浏览器会继续尝试加载 PHP 输出,无论是使用无限循环还是致命错误消息,这是本问题的主题。
通过在代码开头降低允许的分配大小,您可能会防止致命错误,正如其他答案中讨论的那样。
那么,您可能会留下一个终止程序,但仍然难以调试。
无论你的程序是否终止,都可以通过在程序中插入BreakLoop()
调用来操纵代码,以便找出导致问题的循环或递归。
BreakLoop的定义如下:
function BreakLoop($MaxRepetitions=500,$LoopSite="unspecified")
{
static $Sites=[];
if (!@$Sites[$LoopSite] || !$MaxRepetitions)
$Sites[$LoopSite]=[ n =>0, if =>0];
if (!$MaxRepetitions)
return;
if (++$Sites[$LoopSite][ n ] >= $MaxRepetitions)
{
$S=debug_backtrace(); // array_reverse
$info=$S[0];
$File=$info[ file ];
$Line=$info[ line ];
exit("*** Loop for site $LoopSite was interrupted after $MaxRepetitions repetitions. In file $File at line $Line.");
}
} // BreakLoop
$LoopSite参数可以是您代码中的函数名称。 实际上并不是必需的,因为您将收到的错误消息将指向包含BreakLoop()调用的行。