0

我正在尝试一种使用 PHP 更轻松地调试 Cronjob 脚本的方法。无需在服务器上访问 xdebug 等。

为此,我想获取代码输入的嵌套结构的数量。我将在代码中将其称为NESTING

据我所知,至少有两种方法以某种方式使用嵌套级别。

打破$n; 逃脱 $n 嵌套。goto 不允许进入更深的。

<?php 

print(__NESTING__);// 1

for($i=0;$i<10;$i++){

    print(__NESTING__);// 2

}

print(__NESTING__);// 1
die;

背景:

这应该适用于 PHP > 5.3 + 7 到目前为止,我尝试用谷歌搜索最接近主题的是:

ob_get_level()

代码示例:

到目前为止的调试器想法:

argv[1]='somefile.php;'

<?php

$script=fopen(argv[1],'rb');
$tfilename='T'.substr(md5(mt_rand()), 0, 7).argv[1];//some random name
$tscript=fopen($tfilename,'wb+');
fputs($tscript,fgets($script).' $next_line=0;$nest_limit=1;'); //<?php +ini

$line_num=0;
while($line=fgets($script)){

    $line='L'.($line_num++).': '. 
      'if((__LINE__>$next_line)&&(__NESTING__<=$nest_limit)){'.

       'print("Line".__LINE__.date('r'));eval(rtrim(fgets(STDIN)));'.

      '}'.$line;
    fputs($tscript,$line);
}
fclose($tscript);
fclose($script);
print('debug script?');
while(rtrim(fgets(STDIN))==='y'){
    try{include $tfilename;}catch(Exeption $e){print($e->getMessage());}
    print('repeat?');
}
unlink($tfilename);
die;

因此可以执行脚本、跳过调试行、跳过循环、返回一行、使用特殊值测试脚本行为、打印变量等。

PS:我没有测试代码是否有错误,所以它可能无法运行它来解释这个想法和我需要什么

__NESTING__ 

为了。

编辑1:预期输出:

Line0 10:00:20 \\ press enter
Line1 10:00:20 \\ input: $next_line=10;
Line10 10:00:20 \\ enter
Line11 10:01:10 \\ someting takes a lot of time
PHP FATAL ERROR...

2cond try
Line0 10:01:15 \\ input $next_line=11
Line11 10:02:20 \\ input var_dump($something)

感谢任何指点,干杯

PS.:感谢橡皮鸭调试。注意到我只需要将 $next_line 设置为循环之后。仍然如果有人知道如何获得如此嵌套级别会很高兴知道

4

1 回答 1

0

如果我理解您的问题,听起来您正在尝试合并一个计数器,以查看您的脚本在死亡/中断/跳过之前运行了多少次。这应该是相当直截了当的

$count = 0;
while ($line = fget($script)) {
  $count++;
  if ($foo = $bar) {
    $fooBar = $line;
    break;
  }
  if ($baz == 2) {
    goto 45;
  }
  //other random logic
}
echo "The script executed " . $count . " times.";

如果您想计算在逻辑之后,或者只计算它进入代码特定部分的次数,您可以设置其他变量来计算细节或将计数器移动到您希望看到它计数的确切位置。

但是,如果您要像第一个示例中那样迭代一组数字

for ($i = 0, $i < 10, $i++)

那么这有点没用,因为你已经知道你正在执行的次数。唯一的例外是,如果您的循环中有一个中断,并且您试图计算它在中断之前执行的次数,那么您仍然可以使用计数器来获取该信息。

于 2019-08-22T22:24:28.027 回答