CodeIgniterの標準エラー処理メカニズムの改良

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、 ''、 '');
		
		出る
	 }




その結果、フレームワークのコアファイルはそのまま残ります。

ここから新しいソースをダウンロードしてください



同時に、マイナーな改善が行われました-コントローラーがロードされる前にエラーが発生し、管理者への通知の送信が機能しなかった場合、これに必要なクラスがロードされなかったため、チェックがあり、目的のクラスがロードされていない場合、ロードし、マイナーな変更を加えます



オリジナル記事



All Articles