摘要:簡述這里簡單歸納總結(jié)關(guān)于的錯誤處理和日志記錄的操作。錯誤處理器會正確地設(shè)置響應(yīng)的狀態(tài)碼并使用合適的錯誤視圖頁面來顯示錯誤信息。記錄一個警告消息用來指示一些已經(jīng)發(fā)生的意外。的義務(wù)是正確處理日志消息。相應(yīng)的消息通過被記錄。
簡述
這里簡單歸納總結(jié)關(guān)于Yii的錯誤處理和日志記錄的操作。
錯誤處理(Errors)Yii 內(nèi)置了一個yiiwebErrorHandler錯誤處理器,它使錯誤處理更方便, Yii錯誤處理器做以下工作來提升錯誤處理效果:
所有非致命PHP錯誤(如,警告,提示)會轉(zhuǎn)換成可獲取異常;
異常和致命的PHP錯誤會被顯示,在調(diào)試模式會顯示詳細(xì)的函數(shù)調(diào)用棧和源代碼行數(shù)。
支持使用專用的 控制器操作 來顯示錯誤;
支持不同的錯誤響應(yīng)格式;
yiiwebErrorHandler 錯誤處理器默認(rèn)啟用, 可通過在應(yīng)用的入口腳本中定義常量YII_ENABLE_ERROR_HANDLER來禁用。
使用錯誤處理器yiiwebErrorHandler 注冊成一個名稱為errorHandler應(yīng)用組件, 可以在應(yīng)用配置中配置它類似如下:
return [ "components" => [ "errorHandler" => [ "maxSourceLines" => 20, ], ], ];
使用如上代碼,異常頁面最多顯示20條源代碼。
如前所述,錯誤處理器將所有非致命PHP錯誤轉(zhuǎn)換成可獲取異常,也就是說可以使用如下代碼處理PHP錯誤:
use Yii; use yiiaseErrorException; try { 10/0; } catch (ErrorException $e) { Yii::warning("Division by zero."); } // execution continues...
如果你想顯示一個錯誤頁面告訴用戶請求是無效的或無法處理的,可簡單地拋出一個 yiiwebHttpException異常, 如 yiiwebNotFoundHttpException。錯誤處理器會正確地設(shè)置響應(yīng)的HTTP狀態(tài)碼并使用合適的錯誤視圖頁面來顯示錯誤信息。
use yiiwebNotFoundHttpException; throw new NotFoundHttpException();
當(dāng)錯誤處理器 捕獲到一個異常,會從異常中提取狀態(tài)碼并賦值到響應(yīng)
那么 yiiwebNotFoundHttpException 對應(yīng)HTTP 404狀態(tài)碼,以下為Yii預(yù)定義的HTTP異常:
yiiwebBadRequestHttpException: status code 400.
yiiwebConflictHttpException: status code 409.
yiiwebForbiddenHttpException: status code 403.
yiiwebGoneHttpException: status code 410.
yiiwebMethodNotAllowedHttpException: status code 405.
yiiwebNotAcceptableHttpException: status code 406.
yiiwebNotFoundHttpException: status code 404.
yiiwebServerErrorHttpException: status code 500.
yiiwebTooManyRequestsHttpException: status code 429.
yiiwebUnauthorizedHttpException: status code 401.
yiiwebUnsupportedMediaTypeHttpException: status code 415.
如果想拋出的異常不在如上列表中,可創(chuàng)建一個yiiwebHttpException異常,帶上狀態(tài)碼拋出,如下:
throw new yiiwebHttpException(402);日志(Logging)
Yii提供了一個強(qiáng)大的日志框架,這個框架具有高度的可定制性和可擴(kuò)展性。使用這個框架,你可以輕松地記錄各種類型的消息,過濾它們, 并且將它們收集到不同的目標(biāo),諸如文件,數(shù)據(jù)庫,郵件。
使用Yii日志框架涉及下面的幾個步驟:
在你代碼里的各個地方記錄 log messages;
在應(yīng)用配置里通過配置 log targets 來過濾和導(dǎo)出日志消息;
檢查由不同的目標(biāo)導(dǎo)出的已過濾的日志消息(例如:Yii debugger)。
日志消息記錄日志消息就跟調(diào)用下面的日志方法一樣簡單:
Yii::trace():記錄一條消息去跟蹤一段代碼是怎樣運(yùn)行的。這主要在開發(fā)的時候使用。
Yii::info():記錄一條消息來傳達(dá)一些有用的信息。
Yii::warning():記錄一個警告消息用來指示一些已經(jīng)發(fā)生的意外。
Yii::error():記錄一個致命的錯誤,這個錯誤應(yīng)該盡快被檢查。
信息:日志消息可以是字符串,也可以是復(fù)雜的數(shù)據(jù),諸如數(shù)組或者對象。log targets 的義務(wù)是正確處理日志消息。 默認(rèn)情況下,假如一條日志消息不是一個字符串,它將被導(dǎo)出為一個字符串,通過調(diào)用:
yiihelpersVarDumper::export()
為了更好地組織和過濾日志消息,我們建議您為每個日志消息指定一個適當(dāng)?shù)念悇e。 您可以為類別選擇一個分層命名方案,這將使得log targets 在基于它們的分類來過濾消息變得更加容易。 一個簡單而高效的命名方案是使用PHP魔術(shù)常量 METHOD 作為分類名稱。這種方式也在Yii框架的核心代碼中得到應(yīng)用, 例如:
Yii::trace("start calculating average revenue", __METHOD__);
METHOD 常量計(jì)算值作為該常量出現(xiàn)的地方的方法名(完全限定的類名前綴)。
例如,假如上面那行代碼在這個方法內(nèi)被調(diào)用,則它將等于字符串 "appcontrollersRevenueController::calculate"。
日志目標(biāo)一個日志目標(biāo)是一個 yiilogTarget 類或者它的子類的實(shí)例。它將通過他們的嚴(yán)重層級和類別來過濾日志消息,然后將它們導(dǎo)出到一些媒介中。
例如,一個 yiilogDbTarget 目標(biāo)導(dǎo)出已經(jīng)過濾的日志消息到一個數(shù)據(jù)的表里面,而一個 yiilogEmailTarget 目標(biāo)將日志消息導(dǎo)出到指定的郵箱地址里。
消息過濾對于每一個日志目標(biāo),你可以配置它的 levels 和 categories 屬性來指定哪個消息的嚴(yán)重程度和分類目標(biāo)應(yīng)該處理。
levels 屬性是由一個或者若干個以下值組成的數(shù)組:
error:相應(yīng)的消息通過 Yii::error() 被記錄。
warning:相應(yīng)的消息通過 Yii::warning() 被記錄。
info:相應(yīng)的消息通過 Yii::info() 被記錄。
trace:相應(yīng)的消息通過 Yii::trace() 被記錄。
profile:相應(yīng)的消息通過 Yii::beginProfile() 和 Yii::endProfile() 被記錄。更多細(xì)節(jié)將在 Profiling 分段解釋。
如果你沒有指定 levels 的屬性, 那就意味著目標(biāo)將處理 任何 嚴(yán)重程度的消息。
如果你沒有指定 categories 屬性,這意味著目標(biāo)將會處理 任何 分類的消息。
日志目標(biāo)以某種格式導(dǎo)出過濾過的日志消息。例如,假如你安裝一個 FileTarget 類的日志目標(biāo), 你應(yīng)該能找出一個日志消息類似下面的 runtime/log/app.log 文件:
2014-10-04 18:10:15 [::1][][-][trace][yiiaseModule::getModule] Loading module: debug
你可以通過配置 yiilogTarget::prefix 的屬性來自定義格式,這個屬性是一個PHP可調(diào)用體返回的自定義消息前綴。例如,下面的代碼配置了一個日志目標(biāo)的前綴是每個日志消息中當(dāng)前用戶的ID(IP地址和Session ID被刪除是由于隱私的原因)。
[ "class" => "yiilogFileTarget", "prefix" => function ($message) { $user = Yii::$app->has("user", true) ? Yii::$app->get("user") : null; $userID = $user ? $user->getId(false) : "-"; return "[$userID]"; } ]
除了消息前綴以外,日志目標(biāo)也可以追加一些上下文信息到每組日志消息中。
你可以通過配置 logVars 屬性適應(yīng)這個行為,這個屬性是你想要通過日志目標(biāo)包含的全局變量名稱。
舉個例子,下面的日志目標(biāo)配置指明了只有 $_SERVER 變量的值將被追加到日志消息中:
[ "class" => "yiilogFileTarget", "logVars" => ["_SERVER"], ]
你可以將 logVars 配置成一個空數(shù)組來完全禁止上下文信息包含?;蛘呒偃缒阆胍獙?shí)現(xiàn)你自己提供上下文信息的方式, 你可以重寫 yiilogTarget::getContextMessage() 方法。
日志寫入的案例1、在具體的控制器上進(jìn)行日志收集處理,調(diào)用相應(yīng)的日志接口即可。
其中傳參需要注意,日志內(nèi)容($content)和控制器方法路徑(魔術(shù)常量 __METHOD__)需要保證必傳。
2、對應(yīng)日志處理接口處理,實(shí)現(xiàn)代碼封裝。
日志收集接口代碼封裝需要注意幾個點(diǎn):
(1)組裝日志內(nèi)容需要按照與團(tuán)隊(duì)內(nèi)部約定好的格式進(jìn)行拼接組裝。
(2)確定好日志文件路徑($logFile),和文件命名規(guī)則,因?yàn)槿罩究赡苁菍?shí)時,可能需要生產(chǎn)多個日志文件。
(3)日志寫入內(nèi)容時判斷日志文件是否存在(是否需要新建),寫入時利用 flock() 進(jìn)行文件獨(dú)占鎖定(目的是避免同時操作同一份日志),利用 clearstatcache() 函數(shù)清除文件狀態(tài),再日志內(nèi)容寫入日志文件。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21613.html
摘要:認(rèn)證事件類在登錄和注銷流程引發(fā)一些事件。成功注銷后引發(fā)。提供兩種授權(quán)方法存取控制過濾器和基于角色的存取控制。允許已認(rèn)證用戶執(zhí)行操作。指定一個回調(diào)函數(shù)用于判定該規(guī)則是否滿足條件。 簡述 在程序開發(fā)過程中,往往都不能忽視安全問題,無論你的框架有多么完美,都會有破綻,所以完善自己的系統(tǒng),從程序開發(fā)的安全角度去思考問題,把一切潛在的危機(jī)扼殺在搖籃中。 認(rèn)證(Authentication) 認(rèn)證...
摘要:簡述是一個強(qiáng)大的代碼生成器,主要用于后臺代碼生成。下面列出由生成的文件,以便你研習(xí)功能和實(shí)現(xiàn),或修改它們控制器模型和視圖補(bǔ)充被設(shè)計(jì)成高度可定制和可擴(kuò)展的代碼生成工具。使用生成代碼是一個基于界面的代碼生成工具。 簡述 Gii 是一個強(qiáng)大的代碼生成器,主要用于后臺代碼生成。 開始 Gii Gii 是 Yii 中的一個模塊??梢酝ㄟ^配置應(yīng)用的 yiibaseApplication::modu...
摘要:運(yùn)行來安裝指定的擴(kuò)展。這更便于用戶辨別是否是的擴(kuò)展。當(dāng)用戶運(yùn)行安裝一個擴(kuò)展時,文件會被自動更新使之包含新擴(kuò)展的信息。上述代碼表明該擴(kuò)展依賴于包。例如,上述的條目聲明將對應(yīng)于別名。為達(dá)到這個目的,你應(yīng)當(dāng)在公開發(fā)布前做測試。 簡述 擴(kuò)展是專門設(shè)計(jì)的在 Yii 應(yīng)用中隨時可拿來使用的, 并可重發(fā)布的軟件包。 基礎(chǔ) 例如, yiisoft/yii2-debug 擴(kuò)展在你的應(yīng)用的每個頁面底部添加...
摘要:把所有的增量數(shù)據(jù)庫遷移提交到生產(chǎn)環(huán)境數(shù)據(jù)庫當(dāng)中。如果其中任意一個遷移提交失敗了,那么這條命令將會退出并停止剩下的那些還未執(zhí)行的遷移。執(zhí)行這條命令期間不會有任何的遷移會被提交或還原。 簡述 數(shù)據(jù)遷移就是數(shù)據(jù)庫表在團(tuán)隊(duì)建的遷移操作,達(dá)到團(tuán)隊(duì)相互間的信息同步,數(shù)據(jù)統(tǒng)一。 數(shù)據(jù)庫遷移 一般步驟: 1、在 yii2 的 migrate 中,通常用來對數(shù)據(jù)庫數(shù)據(jù)表進(jìn)行修改操作,主要對結(jié)構(gòu)和小部分?jǐn)?shù)...
摘要:它由一個或多個類組成,它們在控制臺環(huán)境下通常被稱為命令??刂婆_入口腳本通常被稱為,位于應(yīng)用程序的根目錄。選項(xiàng)通過覆蓋在中的方法,你可以指定可用于控制臺命令選項(xiàng)。參數(shù)將傳遞給請求的子命令對應(yīng)的操作方法。通常,執(zhí)行成功的命令會返回。 簡述 控制臺應(yīng)用程序的結(jié)構(gòu)非常類似于 Yii 的一個 Web 應(yīng)用程序,主要用于終端服務(wù)器執(zhí)行。 控制臺命令 控制臺應(yīng)用程序的結(jié)構(gòu)非常類似于 Yii 的一個 ...
閱讀 1609·2021-11-04 16:11
閱讀 3328·2021-09-09 11:33
閱讀 1571·2019-08-30 15:54
閱讀 626·2019-08-30 15:44
閱讀 3185·2019-08-30 15:43
閱讀 2567·2019-08-30 13:06
閱讀 1707·2019-08-29 17:00
閱讀 908·2019-08-29 15:33