PHP中是否存在任何运行时堆栈跟踪功能? (对谁也写Java,我的意思是jstack。)
我得到的PHP后台进程很少,他们会在一些未知行上冻结一次。我可以简单地将它们全部杀死然后重新启动,但这并不能阻止它再次发生。
是否有API可以监视堆栈并告诉?比如JDK提供的jstack实用程序?
答案 0 :(得分:0)
在调试未知错误方面,您有几个选择。
--enable-debug
配置linux和PHP。使用gdb
运行崩溃并分析回溯的文件。
--enable-debug
配置PHP,运行Apache
的Linux机器,并且强烈希望/能够理解软件在较低级别上运行的方式 - 电平。gdb
运行Apache
:gdb /usr/lib/httpd
(gdb) run -X
gdb
:
(gdb) backtrace
gdb
来运行脚本本身:(gdb) run /path/to/the/script.php
(gdb) backtrace
gdb
信息,请查看quick-reference guide。
创建一个custom error handler,在抛出错误时打印堆栈跟踪。
require('ErrorHandler.php');
添加到页面顶部,它就会自动注册以处理任何错误。当然,请务必更新include-path以指向实际文件。ErrorHandler.php:
<?php
class ErrorHandler {
public static function captureError($err_no, $message, $file, $line) {
echo '<strong>Error (#' . $err_no . '):</strong> ' . $message . ' in ' . $file . ' on line #' . $line . '<br />';
debug_print_backtrace();
}
public static function captureException($exception) {
echo '<pre>' . print_r($exception, true) . '</pre>';
}
public static function captureShutdown() {
if (($error = error_get_last()) !== null) {
debug_print_backtrace();
}
}
}
set_error_handler(array('ErrorHandler', 'captureError'));
set_exception_handler(array('ErrorHandler', 'captureException'));
register_shutdown_function(array('ErrorHandler', 'captureShutdown'));
?>