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、 ''、 '');
出る
}
その結果、フレームワークのコアファイルはそのまま残ります。
ここから新しいソースをダウンロードして
ください 。
同時に、マイナーな改善が行われました-コントローラーがロードされる前にエラーが発生し、管理者への通知の送信が機能しなかった場合、これに必要なクラスがロードされなかったため、チェックがあり、目的のクラスがロードされていない場合、ロードし、マイナーな変更を加えます
オリジナル記事