- 例外処理機能なし
- メールでサイト管理者にエラーを通知する方法はありません
- 発生したエラーについてのわずかな情報(以前に作業したフレームワークでは、エラーテキストにグローバル変数のダンプが追加され、デバッグプロセスが大幅に促進されます。CodeIgniterで同様のスキームを参照してください)
修正します=)
例外処理(以下のカーネルファイルを編集せずにオプションを参照)
ファイル/system/codeigniter/CodeIgniter.phpで例外ハンドラーを指定します
set_exception_handler( '_ exception_handler2');
行の隣
set_error_handler( '_ exception_handler');
例外が発生すると、 _exception_handler2メソッドが/system/codeigniter/Common.phpファイルから呼び出されます。
そして、メソッド自体は次のとおりです。
/ ** *例外ハンドラー * * / 関数_exception_handler2($ errstr) { $ error =&load_class( 'Exceptions'); //例外に関するテキストを画面に表示します echo $ error-> show_error( 'error'、nl2br($ errstr)); //エラーを記録する必要がありますか? いや? 完了です... $ config =&get_config(); if($ config ['log_threshold'] == 0) { 帰る } //ログにメッセージを書き込みます $ error-> log_exception( 'Exception'、$ errstr、 ''、 ''); 出る }
メール通知と追加のエラー情報
管理者がメールボックス内のサイトのエラーに関する通知を受信するには、 / system / application / config / config.phpファイルで管理者のメールアドレスを指定する必要があります。
/ * | ------------------------------------------------- ------------------------- | サイトのエラーの管理者通知 | ------------------------------------------------- ------------------------- | | エラーと例外に関するメールを管理者に送信する場合 | 次のパラメーターの管理者メールボックスのアドレスを指定します | * / $ config ['log_to_email'] = 'admin@site.ru';
メッセージを送信したくない場合は、このパラメーターを指定しないか、空白のままにしてください。
基本クラスの例外を拡張する-ディレクトリ/システム/アプリケーション/ライブラリ/
次の内容のMY_Exceptions.phpファイルを作成します。
クラスMY_ExceptionsはCI_Exceptionsを拡張します { / ** *例外ロガー * *このメソッドは、基本的な追加機能を置き換えます *サイト管理者にエラーに関するメッセージを送信します *および追加情報をログに出力 * * @access private * @param stringエラーの重大度 * @param stringエラー文字列 * @param stringエラーファイルパス * @param stringエラー行番号 * @return string * / 関数log_exception($重大度、$メッセージ、$ファイルパス、$行) { //サイト管理者にメッセージを送信します $ this-> adminmail($メッセージ); $ severity =(!isset($ this-> levels [$ severity]))? $重大度:$ this->レベル[$ severity]; //環境変数のダンプにメッセージテキストを追加します $ message。= "\ n"。 $ this-> GetGlobalVariables()。 $ファイルパス。 '。$行。 「\ n \ n」; log_message( 'error'、 'Severity:'。$ severity。 '->'。$ message、TRUE); } / ** * 404ページが見つからないハンドラ * *このメソッドは、管理者にメッセージを送信する基本機能を補完します *エラーの場合 * * @access private * @param文字列 * @return string * / 関数show_404($ページ= '') { //メッセージを送信します $ message = '404 Page Not Found->'。$ページ; $ this-> adminmail($メッセージ); 親:: show_404($ページ); } / ** *環境変数のダンプを返します * * @return string dump環境変数 * / 関数GetGlobalVariables() { $ content = 'REMOTE_ADDR ='。$ _ SERVER ["REMOTE_ADDR"]。 "\ n"; if(isset($ _ SERVER ["HTTP_REFERER"])) { $ content。= 'HTTP_REFERER ='。$ _ SERVER ["HTTP_REFERER"]。 "\ n"; } $ content。= 'USER_AGENT ='。$ _ SERVER ["HTTP_USER_AGENT"]。 "\ n"; $ content。= '$ _SERVER [\' REQUEST_URI \ '] ='; $ content。= var_export(@ $ _ SERVER ['REQUEST_URI']、true); $ content。= "\ n"。 '$ _ GET ='; $ content。= var_export(@ $ _ GET、true); $ content。= "\ n"。 '$ _ POST ='; $ content。= var_export(@ $ _ POST、true); $ content。= "\ n"; $コンテンツを返します。 } / ** *メソッドは管理者にメールでエラーメッセージを送信します * * @return * @param object $ message * / 関数adminmail($メッセージ) { $ CI =&get_instance(); //設定がロードされていない場合-ロード if(!isset($ CI-> config)) { $ CI-> config =&load_class( 'Config'); } //ブートローダーがロードされていない場合-ロード if(!isset($ CI-> load)) { $ CI-> load =&load_class( 'Loader'); } //メールクラスをダウンロードします if(!isset($ CI-> email)) { $ CI-> email =&load_class( 'Email'); } //郵便クラスの場合、言語クラスが必要です if(!isset($ CI-> lang)) { $ CI-> lang =&load_class( 'Language'); } //管理者の住所 $ email = $ CI-> config-> item( 'log_to_email'); //アドレスが指定されていない場合-何もしない if(!strlen($ email))) { 帰る } //送信 $ CI-> email-> from( 'noreply'); $ CI-> email-> to($ email); $ CI-> email-> subject( 'サイトでエラーが発生しました'); $ CI->電子メール->メッセージ($メッセージ); $ CI-> email-> send(); } }
忘れないでください。 ロギングメカニズムを有効にするには、 / system / application / config / config.phpファイルでlog_thresholdパラメーターに値「1」を指定する必要があります。
ソースをダウンロードできます( CodeIgniter 1.7.2からCodeIgniter.phpおよびCommon.phpファイル )
コードは非常に単純です-ソースからすべてが明確であると思います。
まだ質問がある場合は、コメントでお答えします。
更新:フックを使用して例外ハンドラーを追加する
コメントの中で、 Mordredはカーネルファイルを編集する代わりにフックを使用して、例外ハンドラーとハンドラー自体のインストールコードを呼び出すようアドバイスしました。アドバイスをありがとう、私はそうしました。
まず、Cookieメカニズムを有効にする必要があります。そのために、 / system / application / config / config.phpファイルで、 enable_hooksパラメーターをTRUEに設定します。
$ config ['enable_hooks'] = TRUE;
次に、ファイル/system/application/config/hooks.phpにフック自体をインストールしますwrite:
$ hook ['pre_system'] = array( 'クラス' => ''、 '関数' => 'addExceptionHandler'、 「ファイル名」=>「exception_hook.php」、 'filepath' => 'フック' );
このコードは、起動時にaddExceptionHandlerメソッドが/system/application/hooks/exception_hook.phpファイルから呼び出されることを意味します。 このファイルの内容は次のとおりです。
if(!defined( 'BASEPATH'))exit( '直接スクリプトアクセス不可'); / ** *例外ハンドラーをインストールする * * / 関数addExceptionHandler() { set_exception_handler( '_ exception_handler2'); } / ** *例外ハンドラー * * / 関数_exception_handler2($ errstr) { $ error =&load_class( 'Exceptions'); $ error-> adminmail( '1'); //例外に関するテキストを画面に表示します echo $ error-> show_error( 'error'、nl2br($ errstr)); //エラーを記録する必要がありますか? いや? 完了です... $ config =&get_config(); if($ config ['log_threshold'] == 0) { 帰る } //ログにメッセージを書き込みます $ error-> log_exception( 'Exception'、$ errstr、 ''、 ''); 出る }
その結果、フレームワークのコアファイルはそのまま残ります。
ここから新しいソースをダウンロードしてください 。
同時に、マイナーな改善が行われました-コントローラーがロードされる前にエラーが発生し、管理者への通知の送信が機能しなかった場合、これに必要なクラスがロードされなかったため、チェックがあり、目的のクラスがロードされていない場合、ロードし、マイナーな変更を加えます
オリジナル記事