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();