摘要:于是查到有一個(gè)鉤子的功能最終有鉤子能滿(mǎn)足需求在系統(tǒng)執(zhí)行的早期調(diào)用,這個(gè)時(shí)候只有基準(zhǔn)測(cè)試類(lèi)和鉤子類(lèi)被加載了,還沒(méi)有執(zhí)行到路由或其他的流程。
最近線(xiàn)上項(xiàng)目最近偶爾報(bào)500錯(cuò)誤,雖然根據(jù)日志可以拿到引發(fā)錯(cuò)誤的請(qǐng)求參數(shù),但是還是要自己去模擬請(qǐng)求,更甚著,由于等到自己去模擬請(qǐng)求的時(shí)候,引發(fā)錯(cuò)誤的主體(比如,同樣的訂單,同樣的請(qǐng)求參數(shù),訂單狀態(tài)為3時(shí)會(huì)報(bào)錯(cuò),但是當(dāng)你去模擬的時(shí)候,訂單狀態(tài)已經(jīng)變?yōu)?了,此時(shí)又不會(huì)報(bào)錯(cuò)了)的狀態(tài)已經(jīng)發(fā)生變化,因此需要保存發(fā)生錯(cuò)誤時(shí)候的上下文。
于是查到CI有一個(gè)鉤子的功能
最終有pre_system鉤子能滿(mǎn)足需求:
pre_system 在系統(tǒng)執(zhí)行的早期調(diào)用,這個(gè)時(shí)候只有 基準(zhǔn)測(cè)試類(lèi) 和 鉤子類(lèi) 被加載了, 還沒(méi)有執(zhí)行到路由或其他的流程。
具體使用方法如下:
在對(duì)應(yīng)項(xiàng)目的hooks.php里添加
$hook["pre_system"][] = array( "class" => "ErrorCatch", "function" => "errorCatchInit", "filename" => "ErrorCatch.php", "filepath" => "controllers/app", //這里不要加APPPATH );
然后新建對(duì)應(yīng)的類(lèi)
最終錯(cuò)誤處理類(lèi)如下:
class ErrorCatch { public function errorCatchInit() { register_shutdown_function([$this, "handleShutdown"]); } public static function handleShutdown() { //write_log(); } }
但此時(shí)還不能捕獲錯(cuò)誤日志,因?yàn)镃I本身自己實(shí)現(xiàn)了一套register_shutdown_function,在core/Common.php的_error_handler方法里,有如下代碼
$is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity); · · · if ($is_error) { exit; //直接就腳本退出了 }
有多個(gè)register_shutdown_function callback時(shí),當(dāng)前面的exit后,就不會(huì)觸發(fā)后面的callback了, 于是:
在index.php里添加 define("SELF_ERROR_SHUT_DOWN", 1); 然后 if ($is_error) { exit; //直接就腳本退出了 } 改為 if ($is_error) { if (defined("SELF_ERROR_SHUT_DOWN")) { return; } exit; }
至此,就可以統(tǒng)一收集程序錯(cuò)誤,并且上報(bào)了
原文
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26115.html
摘要:請(qǐng)求未通過(guò)的驗(yàn)證時(shí)會(huì)拋出此異常。異常處理是非常重要但又容易讓開(kāi)發(fā)者忽略的功能,這篇文章簡(jiǎn)單解釋了內(nèi)部異常處理的機(jī)制以及擴(kuò)展異常處理的方式方法。 異常處理是編程中十分重要但也最容易被人忽視的語(yǔ)言特性,它為開(kāi)發(fā)者提供了處理程序運(yùn)行時(shí)錯(cuò)誤的機(jī)制,對(duì)于程序設(shè)計(jì)來(lái)說(shuō)正確的異常處理能夠防止泄露程序自身細(xì)節(jié)給用戶(hù),給開(kāi)發(fā)者提供完整的錯(cuò)誤回溯堆棧,同時(shí)也能提高程序的健壯性。 這篇文章我們來(lái)簡(jiǎn)單梳理一下...
摘要:一的幾個(gè)函數(shù)異常捕獲自定義處理函數(shù)注冊(cè)錯(cuò)誤捕獲自定義處理函數(shù)注冊(cè)程序執(zhí)行時(shí)異常終止錯(cuò)誤捕獲處理函數(shù)注冊(cè)這三個(gè)函數(shù)在錯(cuò)誤處理控制中給開(kāi)發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。下面要說(shuō)的類(lèi)庫(kù)是借鑒了日志系統(tǒng)的設(shè)計(jì)。 引言 接觸過(guò)php框架的朋友們可能都知道,日志在項(xiàng)目中的重要作用了,他可以幫助我們定位錯(cuò)誤的位置,讓程序更友好(處理得當(dāng)?shù)脑?huà)不會(huì)直接拋出一大堆只有程...
摘要:回過(guò)頭來(lái)發(fā)現(xiàn),我們的項(xiàng)目,雖然在服務(wù)端層面做好了日志和性能統(tǒng)計(jì),但在前端對(duì)異常的監(jiān)控和性能的統(tǒng)計(jì)。對(duì)于前端的性能與異常上報(bào)的可行性探索是有必要的。這是我們頁(yè)面加載性能優(yōu)化需求中主要上報(bào)的相關(guān)信息。 概述 對(duì)于后臺(tái)開(kāi)發(fā)來(lái)說(shuō),記錄日志是一種非常常見(jiàn)的開(kāi)發(fā)習(xí)慣,通常我們會(huì)使用try...catch代碼塊來(lái)主動(dòng)捕獲錯(cuò)誤、對(duì)于每次接口調(diào)用,也會(huì)記錄下每次接口調(diào)用的時(shí)間消耗,以便我們監(jiān)控服務(wù)器接口...
閱讀 607·2021-11-18 13:12
閱讀 1323·2021-11-15 11:39
閱讀 2487·2021-09-23 11:22
閱讀 6221·2021-09-22 15:15
閱讀 3668·2021-09-02 09:54
閱讀 2320·2019-08-30 11:10
閱讀 3252·2019-08-29 14:13
閱讀 2918·2019-08-29 12:49