【发布时间】:2011-06-09 14:08:47
【问题描述】:
有没有一种简单的方法(没有在每一行之后粘贴 fwrites)让 PHP 将每个执行的行写入日志?
【问题讨论】:
-
如果您希望使用它进行调试,您最好使用 xdebug。
-
我主要是想知道这是否可能!
标签: php
有没有一种简单的方法(没有在每一行之后粘贴 fwrites)让 PHP 将每个执行的行写入日志?
【问题讨论】:
标签: php
虽然我同意@gnif,因为调试器最适合它,但我仍然会回答你的问题,因为它是可能的(不完美,但可能)。
假设您有以下代码:
sometest.php
<?php
declare(ticks=1);
include_once 'debug.php';
$a = 'foo';
$b = 'bar';
$c = $a . $b;
$d = $e = "hello";
strlen($d);
include 'somefile.php';
somefile.php
<?php
$hello = 'world';
所以,sometest.php 包含以下文件 (debug.php):
<?php
register_tick_function(function(){
$backtrace = debug_backtrace();
$line = $backtrace[0]['line'] - 1;
$file = $backtrace[0]['file'];
if ($file == __FILE__) return;
static $fp, $cur, $buf;
if (!isset($fp[$file])) {
$fp[$file] = fopen($file, 'r');
$cur[$file] = 0;
}
if (isset($buf[$file][$line])) {
$code = $buf[$file][$line];
} else {
do {
$code = fgets($fp[$file]);
$buf[$file][$cur[$file]] = $code;
} while (++$cur[$file] <= $line);
}
$line++;
echo "$code called in $file on line $line\n";
});
registers a tick function,还有declares the tick interval。它将跟踪使用回溯调用的文件/行。
现在,如果我们执行sometest.php,我们会得到:
include_once 'debug.php';
called in sometest.php on line 5
$a = 'foo';
called in sometest.php on line 7
$b = 'bar';
called in sometest.php on line 8
$c = $a . $b;
called in sometest.php on line 9
$d = $e = "hello";
called in sometest.php on line 10
strlen($d);
called in sometest.php on line 11
$hello = 'world';
called in somefile.php on line 3
include 'somefile.php';
called in sometest.php on line 13
您可以看到 somefile.php 包含在最后,即使它在 $hello = 'world' 之前被调用。这是因为 tick 函数将在该行的包含完成时调用,而不是在它开始时调用。
另外,tick 函数在函数/方法声明中被调用:
<?php
function foo() {
return 'bar';
}
foo();
会给你类似的东西:
}
called in somefunc.php on line 5 # this is the function declaration
foo();
called in somefunc.php on line 7 # this is the function call
注意:使用刻度时要小心,因为在 5.3.0 之前,线程化 Web 服务器不支持它。
【讨论】: