7

我最近遇到了一个挑战我编程能力的问题,这是一个非常偶然的无限循环。我重写了一些代码来干掉它,并更改了一个被它调用的确切方法重复调用的函数;一个基本的问题,当然。Apache 决定通过崩溃来解决问题,日志只记录了“生成的子进程”。问题是我那天没有真正调试完这个问题,它在下午突然出现,今天不得不解决它。

最后,我的解决方案很简单:手动记录逻辑,看看发生了什么。当我有一个由两行独特的日志文件组成的日志文件时,问题立即显现出来,然后是两行,每行重复大约 200 次。

有哪些方法可以保护自己免受无限循环?而且,当它失败时(它会失败),追踪它的最快方法是什么?确实是最有效的日志文件,还是其他?

如果这是最佳实践,您的答案可能与语言无关,但我宁愿坚持使用 PHP 特定的技术和代码。

4

5 回答 5

15

您可以使用诸如 xdebug 之类的调试器,并遍历您怀疑包含无限循环的代码。

Xdebug - PHP 的调试器和分析器工具

您还可以设置

max_execution_time

限制无限循环在崩溃前燃烧的时间。

于 2009-07-16T19:11:17.543 回答
4

我有时发现最安全的方法是在循环中加入限制检查。循环构造的类型无关紧要。在这个例子中,我选择了一个“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

于 2009-07-17T12:47:19.497 回答
1

单元测试也可能是个好主意。您可能想尝试 PHPUnit。

于 2009-07-16T19:49:15.673 回答
0

您可以跟踪执行并转储调用图吗?无限循环将是显而易见的,您可以轻松挑选出故意(巨大的主循环)与意外(本地 abababa ... 循环或永远不会返回主循环的循环)

我听说过可以为大型复杂程序执行此操作的软件,但我找不到适合您的屏幕截图。有人跟踪了一个像 3dsmax 这样的程序,并抛出了一个非常漂亮的调用图。

于 2009-07-21T21:58:36.300 回答
-2

写简单的代码,这样bug会更明显吗?我想知道您的无限循环是否是由于一些无人能理解的荒谬控制结构毛线球造成的。因此,你当然把它搞砸了。

所有无限循环都不错(例如while (!quit))。

于 2009-07-16T19:36:51.270 回答