亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP5下的Error錯誤處理及問題定位的介紹(代碼示例)

2020-03-22 17:28:30
字體:
來源:轉載
供稿:網友
本篇文章給大家帶來的內容是關于PHP5下的Error錯誤處理及問題定位的介紹(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

來說說當PHP出現E_ERROR級別致命的運行時錯誤的問題定位方法。例如像Fatal error: Allowed memory size of內存溢出這種。當出現這種錯誤時會導致程序直接退出,PHP的error log中會記錄一條錯誤日志說明報錯的具體文件和代碼行數,其它的任何信息都沒有了。如果是PHP7的話還可以像捕獲異常一樣捕獲錯誤,PHP5的話就不行了。

一般想到的方法就是看看報錯的具體代碼,如果報錯文件是CommonReturn.html' target='_blank'>class.php像下面這個樣子。

 ?php * 公共返回封裝 * Class CommonReturnclass CommonReturn * 打包函數 * @param $params * @param int $status * @return mixed static public function packData($params, $status = 0) $res[ status ] = $status; $res[ data ] = json_encode($params); return $res;}

其中json_encode那一行報錯了,然后你查了下packData這個方法,有很多項目的類中都有調用,這時要怎么定位問題呢?

場景復現

好,首先我們復現下場景。假如實際調用的程序bug.php如下

 ?phprequire_once ./CommonReturn.class.php $res = ini_set( memory_limit , 1m $res = [];$char = str_repeat( x , 999);for ($i = 0; $i 900 ; $i++) { $res[] = $char;$get_pack = CommonReturn::packData($res);// something else

運行bug.php PHP錯誤日志中會記錄

[08-Jan-2019 11:22:52 Asia/Shanghai] PHP Fatal error: Allowed memory size of 1048576 bytes exhausted (tried to allocate 525177 bytes) in /CommonReturn.class.php on line 20

復現成功,錯誤日志中只是說明了報錯的文件和哪行代碼,無法知道程序的上下文堆棧信息,不知道具體是哪塊業務邏輯調用的,這樣一來就無法定位修復錯誤。如果是偶爾出現,并且沒有來自前端業務的反饋要怎么排查呢。

解決思路

1、有人想到了修改memory_limit增加內存分配,但這種方法治標不治本。做開發肯定要找到問題的根源。

2、開啟core dump,如果生成code文件可以進行調試,但是發現code只有進程異常退出才會生成。像E_ERROR級別的錯誤不一定會生成code文件,內存溢出這種可能PHP內部自己就處理了。

3、使用register_shutdown_function注冊一個PHP終止時的回調函數,再調用error_get_last如果獲取到了最后發生的錯誤,就通過debug_print_backtrace獲取程序的堆棧信息,我們試試看。

修改CommonReturn.class.php文件如下

 ?php * 公共返回封裝 * Class CommonReturnclass CommonReturn * 打包函數 * @param $params * @param int $status * @return mixed static public function packData($params, $status = 0) register_shutdown_function([ CommonReturn , handleFatal  $res[ status ] = $status; $res[ data ] = json_encode($params); return $res; * 錯誤處理 static protected function handleFatal() $err = error_get_last(); if ($err[ type ]) { ob_start(); debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5); $trace = ob_get_clean(); $log_cont = time=%s . PHP_EOL . error_get_last:%s . PHP_EOL . trace:%s . PHP_EOL; @file_put_contents( /tmp/debug_ . __FUNCTION__ . .log , sprintf($log_cont, date( Y-m-d H:i:s ), var_export($err, 1), $trace), FILE_APPEND);}

再次運行bug.php,日志如下。

error_get_last:array ( type = 1, message = Allowed memory size of 1048576 bytes exhausted (tried to allocate 525177 bytes) , file = /CommonReturn.class.php , line = 23,trace:#0 CommonReturn::handleFatal()

回溯信息沒有來源,尷尬了。猜測因為backtrace信息保存在內存中,當出現致命錯誤時會清空。沒辦法,把backtrace從外面傳進來試試。再次修改CommonReturn.class.php。

 ?php * 公共返回封裝 * Class CommonReturnclass CommonReturn * 打包函數 * @param $params * @param int $status * @return mixed static public function packData($params, $status = 0) ob_start(); debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5); $trace = ob_get_clean(); register_shutdown_function([ CommonReturn , handleFatal ], $trace); $res[ status ] = $status; $res[ data ] = json_encode($params); return $res; * 錯誤處理 * @param $trace static protected function handleFatal($trace) $err = error_get_last(); if ($err[ type ]) { $log_cont = time=%s . PHP_EOL . error_get_last:%s . PHP_EOL . trace:%s . PHP_EOL; @file_put_contents( /tmp/debug_ . __FUNCTION__ . .log , sprintf($log_cont, date( Y-m-d H:i:s ), var_export($err, 1), $trace), FILE_APPEND);}

再次運行bug.php,日志如下。

error_get_last:array ( type = 1, message = Allowed memory size of 1048576 bytes exhausted (tried to allocate 525177 bytes) , file = /CommonReturn.class.php , line = 26,trace:#0 CommonReturn::packData() called at [/bug.php:13]

成功定位到了調用來源,在bug.php的13行。將最終的CommonReturn.class.php發布到生產環境,再次出現出現錯誤時候看日志就可以了。但是這樣的話所有調用packData的程序都會執行trace函數,肯定也會影響性能的。

總結

對于其中使用到的register_shutdown_function函數需要注意,可以注冊多個不同的回調,但是如果某一個回調函數中exit了,那么后面注冊的回調函數都不會執行。

debug_print_backtrace這個獲取回溯信息函數第一個是否包含請求參數,第二個是回溯記錄層數,我們這里是不返回請求參數,可以節省些內存,而且如果請求參數巨大的話調這個函數可能就直接內存溢出了。

最好的辦法就是升級PHP7,可以像異常一樣捕獲錯誤。

以上就是PHP5下的Error錯誤處理及問題定位的介紹(代碼示例)的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美国产中文字幕| 久久九九免费视频| 久久中国妇女中文字幕| 日本一区二区三区四区视频| 日韩一区二区精品视频| 欧美激情高清视频| 亚洲美女av电影| 亚洲精品xxxx| 日韩av电影国产| 国产综合香蕉五月婷在线| 一区二区在线视频播放| 欧美日韩国产二区| 91精品国产综合久久香蕉最新版| 亚洲人成在线一二| 午夜精品一区二区三区视频免费看| 91精品国产高清久久久久久| 亚洲石原莉奈一区二区在线观看| 中文字幕日韩高清| 91精品国产91久久久久久久久| 久久国产精品久久久久久| 亚洲国产美女久久久久| 亚洲成人av在线播放| 91老司机在线| 午夜免费在线观看精品视频| 亚洲精品福利在线| 国产伊人精品在线| 国产午夜精品久久久| 国产成人精品综合久久久| 国产精品极品在线| 成人免费淫片aa视频免费| 91夜夜未满十八勿入爽爽影院| 成人欧美在线视频| 日韩欧美在线中文字幕| 国产成人黄色av| 国产精品嫩草影院一区二区| 日韩欧美一区二区三区久久| 欧美精品成人91久久久久久久| 国产精品99久久久久久久久| 亚洲激情电影中文字幕| 日韩欧美在线视频免费观看| 第一福利永久视频精品| 欧美成人精品激情在线观看| 欧美黑人一级爽快片淫片高清| 国产精品白嫩初高中害羞小美女| 欧美大片第1页| 黑丝美女久久久| 日韩黄在线观看| 成人午夜两性视频| 亚洲国产欧美在线成人app| 亚洲成人动漫在线播放| 精品福利在线看| 欧美日韩一区二区在线| 91精品国产99久久久久久| 久久久中精品2020中文| 久久久久久久亚洲精品| 久久精品视频在线播放| 亚洲成人aaa| 国产精品99久久久久久人| 欧美成人性生活| 18久久久久久| 亚洲香蕉在线观看| 欧美放荡办公室videos4k| 亚洲一区二区中文| 久久99久国产精品黄毛片入口| 中文字幕亚洲一区二区三区| 欧美在线视频导航| 黑人巨大精品欧美一区免费视频| 国产精品爽爽爽爽爽爽在线观看| 国产精品久久久久久久久久久不卡| 久久久免费观看| 国产在线视频不卡| 欧美第一黄色网| 综合av色偷偷网| 亚洲精品一区中文| 久久久亚洲天堂| 久久国产精品电影| 国内精品久久久久影院优| 国产精品久久久久av免费| 国产精品久在线观看| 精品免费在线视频| 亚洲视频在线观看免费| 久久久伊人欧美| 亚洲人成欧美中文字幕| 日韩精品一区二区三区第95| 欧美麻豆久久久久久中文| 91av在线播放| 国产精品九九久久久久久久| 久久免费视频观看| 亚洲欧美日韩国产成人| 国产精品爱久久久久久久| 91国产精品视频在线| 欧美激情视频网| 国产精品美女久久久免费| 97**国产露脸精品国产| 久久久久久亚洲| 91精品久久久久久综合乱菊| 92看片淫黄大片欧美看国产片| 成人情趣片在线观看免费| 日韩高清免费观看| 国产不卡精品视男人的天堂| 国产成人精品免高潮费视频| 日本高清不卡的在线| 欧美精品久久久久久久免费观看| 国产区精品在线观看| 午夜精品久久久久久久久久久久久| 欧美成人网在线| 91精品视频在线免费观看| 亚洲美女免费精品视频在线观看| 亚洲偷熟乱区亚洲香蕉av| 欧美精品情趣视频| 成人免费看吃奶视频网站| 亚洲四色影视在线观看| 久久久伊人欧美| 最新国产精品拍自在线播放| 亚洲精品v天堂中文字幕| 国产一区二区三区四区福利| 精品综合久久久久久97| 中文字幕9999| 国产在线观看精品| 亚洲一区999| 欧美中文字幕视频| 久久精品男人天堂| 91精品成人久久| www.欧美精品| 亚洲人在线视频| 2019av中文字幕| 亚洲2020天天堂在线观看| 中文字幕少妇一区二区三区| 亚洲综合在线中文字幕| 午夜精品久久久99热福利| 国产精品高潮呻吟视频| 青青草一区二区| 狠狠躁夜夜躁久久躁别揉| 国产精品自在线| 国产999精品久久久影片官网| 国产精品国模在线| 国产精品久久久久久搜索| 欧美电影免费播放| 91sao在线观看国产| 这里只有精品在线播放| 欧美在线视频观看| 亚洲摸下面视频| 国产精品免费观看在线| 欧美成人亚洲成人| 日韩日本欧美亚洲| 亚洲国产精品va在线看黑人| 日韩精品日韩在线观看| 欧洲日韩成人av| 国产精品爽黄69天堂a| 日韩国产精品亚洲а∨天堂免| 欧美在线激情网| 欧美激情综合亚洲一二区| 青草热久免费精品视频| 中文字幕日韩av电影| 日韩福利在线播放| 亚洲精品电影网站| 91精品国产综合久久香蕉922| 日韩中文字幕国产精品| 亚洲精品国精品久久99热一| 中文字幕欧美精品在线| 91在线免费观看网站| 亚洲综合精品一区二区| 理论片在线不卡免费观看| 国产亚洲欧美日韩一区二区|