PHP 确实不会输出错误堆栈,但通过函数,还是能够获取到错误堆栈的。
function getBacktrace() {
ob_start();
debug_print_backtrace();
return ob_get_clean();
}
调用上面这个函数取得错误堆栈,再用 file_put_contents('log_path', FILE_APPEND); 写入日志文件即可。
还有一个办法:为 PHP 安装 xdebug 扩展
windows 下的安装方法 安装好后,修改 php.ini
❷ php如何捕获fatal error并写入日志
两者配合,即可捕获fatal error并写入日志 <?php register_shutdown_function(a); set_error_handler(b); function b($error,$message,$file,$line){ global $log; $log=array(); switch($error) { case E_ERROR: $type='ERROR'; break; case E_WARNING: $type='WARNING'; break; case E_NOTICE: $type='NOTICE'; break; default: $type='Unknown error type ['.$error.']'; break; } $log[] = date('Y-m-d H:i:s', time())."\t".$type.': '.$message.' in line '.$line.' of file '.$file.', PHP '.PHP_VERSION.' ('.PHP_OS.')'; if(function_exists('debug_backtrace')) { $backtrace=debug_backtrace(); for($level=1;$level<count($backtrace);$level++) { $message='File: '.$backtrace[$level]['file'].' Line: '.$backtrace[$level]['line'].' Function: '; if(IsSet($backtrace[$level]['class'])) $message.='(class '.$backtrace[$level]['class'].') '; if(IsSet($backtrace[$level]['type'])) $message.=$backtrace[$level]['type'].' '; $message.=$backtrace[$level]['function'].'('; if(IsSet($backtrace[$level]['args'])) { for($argument=0;$argument<count($backtrace[$level]['args']);$argument++) { if($argument>0) $message.=', '; $message.=serialize($backtrace[$level]['args'][$argument]); } } $message.=')'; $log[]=$message; } } } function a(){ global $log; if ($e = error_get_last()) { $log[] = $e['message'] . " in " . $e['file'] . ' line ' . $e['line']; } print_r($log); //还可以干一些其他的事情哦,比方说发邮件 } $a = $_GET['ss']; $a = new b();