我最近碰到了一个挑战我的编程能力的问题,这是一个非常偶然的无限循环。我重写了一些代码来干掉它并改变了一个被它调用的确切方法重复调用的函数;当然是一个基本问题。 Apache决定通过崩溃来解决问题,而日志只注明“衍生出来的子进程”。问题是我当天从未真正调试过这个问题,它在下午出现,并且今天必须解决它。
最后,我的解决方案很简单:手动记录逻辑,看看发生了什么。当我有一个由两个独特的行组成的日志文件,然后是两行每个重复约两百次的行时,问题立即显现。
有什么方法可以保护自己免受无限循环的影响?并且,当它失败(并且会失败)时,追踪它的最快方法是什么?它确实是最有效的日志文件还是别的什么?
如果这是一种最佳做法,你的答案可能与语言无关,但我宁愿坚持使用PHP特定的技术和代码。
答案 0 :(得分:15)
您可以使用xdebug之类的调试器,并遍历您怀疑包含无限循环的代码。
Xdebug - Debugger and Profiler Tool for PHP
您也可以设置
max_execution_time
限制无限循环在崩溃前刻录的时间。
答案 1 :(得分:3)
我有时会发现最安全的方法是在循环中加入限制检查。循环结构的类型无关紧要。在这个例子中,我选择了'while'语句:
$max_loop_iterations = 10000;
$i=0;
$test=true;
while ($test) {
if ($i++ == $max_loop_iterations) {
echo "too many iterations...";
break;
}
...
}
$ max_loop_iterations的合理值可能基于:
希望这有帮助, - N
答案 2 :(得分:1)
单元测试也许是一个好主意。您可能想尝试PHPUnit。
答案 3 :(得分:0)
编写简单的代码,这样bug会更明显吗?我想知道你的无限循环是否是由于一些人类无法理解的控制结构的荒谬纱线球。因此,你当然会把它搞定。
所有无限循环都不错(例如while (!quit)
)。
答案 4 :(得分:0)
你可以追踪执行并转出调用图吗?无限循环将是显而易见的,你可以很容易地找出有意的(一个巨大的主循环)与事故(本地abababa ...循环或循环,永远不会返回到主循环)
我听说过为大型复杂程序执行此操作的软件,但我找不到适合您的截图。有人跟踪了像3dsmax这样的程序并抛出了一个非常漂亮的调用图。