我曾经看过一些PHP的框架或代码,它有一个错误处理程序(类或函数),它会显示错误消息,错误发生的行号以及实际的源代码,如果有某种排序在代码中的错误,它将显示导致错误的实际PHP文件中的行或几行。它真的很酷,我知道你不想在现场制作服务器/网站上做这个,但是为了调试,这是非常好的,这是我以前从未见过的。
我不记得我在哪里看到它或者它是如何完成的。如果您对如何做类似的事情有任何想法,我希望有一个很好的小错误处理类,可以做类似的事情,如果可以,请分享任何代码,想法等,真的很感激任何帮助,谢谢!
答案 0 :(得分:4)
您所说的是stack trace,在PHP中,您可以使用debug_backtrace()检索它。
大多数框架都有自己的方式来显示堆栈跟踪,但基本上它们都使用这些功能。
但是,你真正需要的是Xdebug它是一个调试器和一个PHP的profilter,它将让你一步一步地运行代码。
修改强>
如果您想处理错误以提供自己的工作方式,则必须使用set_error_handler()
和set_exception_handler()
一个简单的例子:
<?php
function myErrorHandler($errno, $errstr, $errfile, $errline) {
echo "[$errno] $errstr" . PHP_EOL;
echo "On line $errline in file $errfile" . PHP_EOL;
$range = array(
$errline - 5,
$errline + 5,
);
$source = explode(PHP_EOL, file_get_contents($errfile));
for ($i = $range[0]; $i <= $range[1]; ++$i) {
if ($i === count($source)) break;
if ($i === $errline-1) {
printf("%d | %s <<<<< Here is the error\n", $i, $source[$i]);
} else {
printf("%d | %s \n", $i, $source[$i]);
}
}
}
set_error_handler('myErrorHandler');
error_reporting(E_ALL);
$a = 'Setting variable $a';
$obj = new Stdclass();
$obj->foo = 'bar';
// Oops I'm calling an undefined variable
echo $undefinedVariable;
$numbers = array(1,2,3,4,5);
for($i = 0; $i < 5; ++$i) {
$numbers[$i] = $i - 1;
}
在cli上尝试这个,应该告诉你:
bguery@joyless:sandbox $ php debugbacktrace.php
[8] Undefined variable: undefinedVariable
On line 33 in file debugbacktrace.php
28 | $obj = new Stdclass();
29 | $obj->foo = 'bar';
30 |
31 | // Oops I'm calling an undefined variable
32 | echo $undefinedVariable; <<<<< Here is the error
33 |
34 | $numbers = array(1,2,3,4,5);
35 | for($i = 0; $i < 5; ++$i) {
36 | $numbers[$i] = $i - 1;
37 | }
38 |
请注意,这是一个非常基本的用法,但它可以解决问题。如果您打算处理E_ERROR
,E_PARSE
等,可能需要做更多工作,而您可能需要使用register_shutdown_function()
答案 1 :(得分:1)
这是一个简单的例子。
set_error_handler('ErrorHandler');
function ErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
print '<pre style="line-height: 2em;">';
printf("==> Error in `%s' line %s: %s\n\n", $filename, $linenum, $errmsg);
debug_print_backtrace();
print '</pre>';
exit($errno);
}
这是原始的和基本的,但它已经比默认的恕我直言要好得多。
至少这会给你一个开始: - )
答案 2 :(得分:1)
Kohana做了类似的事情。
Using the backtrace,您可以找到发生呼叫/错误的文件名和行。从那里,只需打开文件并显示打印出周围的行。
答案 3 :(得分:0)
当您的服务器上运行Xdebug时,您会收到此输出。 (+有一个很好的调试器来逐步执行你的php代码的附加奖励)
看起来像这样:
http://eboraks.com/wp-content/uploads/2009/07/Xdebug_error_message.jpg
关于Xdebug的更多信息:
答案 4 :(得分:0)
就框架而言,CodeIgniter和CakePHP都有错误处理程序,不确定您是否只是在寻找调试器或框架。