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