Ticket #2663 (closed enhancement: fixed)

Opened 9 years ago

Last modified 9 years ago

DBエラーを検知する仕組み

Reported by: yuki Assigned to: kiwa
Priority: minor Milestone: OpenPNE2.13.2
Component: 指定しない Version:
Keywords: Cc:

Description (Last modified by ebihara)

■概要

OpenPNE側にDBエラーを検知する仕組みを追加。

■仕様

エラーハンドラを使用して検知する仕組みを用意する。

config.phpに追加した、

// DBエラーログ出力を出力するかどうか
//    TRUE:出力する FALSE:出力しない
define('OPENPNE_DB_ERROR_LOG',true);

の OPENPNE_DB_ERROR_LOG を true にすることで、DBエラー発生時は常に OPENPNE_VAR_DIR/log/db_errors.log に書き出される。

■関連情報

元のdescription

以下

http://sns.openpne.jp/?m=pc&a=page_fh_diary&target_c_diary_id=17362

からの転記です。

現在のOpenPNEだと、phpエラーは検知する仕組みはありますが、
DBエラーが起こった場合にログを取得出来ません。

ユーザからの報告でデータエラーが判明した後、myisamchkでチェックしてわかりましたが、アプリ側でもDBエラーを検知する仕組みが欲しいです。

以上よろしくお願いいたします。

Change History

06/09/08 16:14:42 changed by ykimura

エラーハンドラを使って検知すると、SQLの詳細までは取得できない???

http://ml.php.gr.jp/pipermail/php-users/2001-September/002040.html

http://ml.php.gr.jp/pipermail/php-users/2001-September/002080.html

色々調べた際に出てきたURL↑

06/09/08 18:27:16 changed by yuki

エラーハンドラを使用して検知する修正パッチは以下のようになるとおもいます。

OPENPNEのDEBUGモード設定により画面にも表示するようにいたしました。

また、DBエラー発生時は常に

OPENPNE_VAR_DIR/log/db_errors.log

こちらに書き出すようにいたしました。

Index: config.php.sample
===================================================================
--- config.php.sample   (リビジョン 7552)
+++ config.php.sample   (作業コピー)
@@ -525,4 +525,9 @@
 // ただしau端末の場合はこの設定にかかわらず、常に「ページのキャッシュをさせないヘッダ」が送信されます
 define('OPENPNE_SEND_NO_CACHE_HEADER', false);

+// DBエラーログ出力を出力するかどうか
+//    TRUE:出力する FALSE:出力しない
+define('OPENPNE_DB_ERROR_LOG',true);
+define('db_error_log', OPENPNE_VAR_DIR . '/log/db_errors.log');
+
 ?>
Index: webapp/init.inc
===================================================================
--- webapp/init.inc     (リビジョン 7552)
+++ webapp/init.inc     (作業コピー)
@@ -83,6 +83,26 @@
 require_once 'OpenPNE/Auth.php';

 require_once 'OpenPNE/Config.php';
+
+require_once 'Log.php';
+
+//エラーハンドルの指定
+PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'db_error_handler');
+
+//エラー処理
+function db_error_handler($error){
+    //DB_ERRORかどうかの判断
+    if ($error->getType() != 'db_error') return;
+
+    //LOG出力処理
+    $msg = sprintf("msg:-> %s\t info:-> %s",$error->getMessage(),$error->getUserInfo());
+    if (OPENPNE_DB_ERROR_LOG){
+        $file =& Log::singleton('file', db_error_log, 'db', null, PEAR_LOG_ERR);
+        $file->log($msg, PEAR_LOG_ERR);
+    }
+    openpne_display_error($msg);
+}
+
 // DBから設定読み込み
 $config =& OpenPNE_Config::getInstance();
 $config->db_load_config();

06/09/08 18:28:19 changed by yuki

訂正:

DBエラーログを出力するかしないかをconfig設定にしてあります。

06/11/08 15:27:35 changed by ebihara

実装方法の提示ありがとうございます。

OpenPNE2.13.2 の対応項目として検討したいと思います。

06/11/08 15:27:53 changed by ebihara

  • summary changed from DBエラーを検地する仕組み to DBエラーを検知する仕組み.
  • milestone set to OpenPNE2.13.2.

08/29/08 15:21:42 changed by kiwa

  • keywords set to 確認中.

trunkにマージしました。

08/29/08 15:28:20 changed by kiwa

  • description changed.

descriptionに仕様をまとめました。

09/03/08 15:50:34 changed by ebihara

r8180 で、 get_class() の返り値が小文字にならない環境(PHP5以降)を考慮していなかったのを修正しました。

09/03/08 20:49:18 changed by ebihara

  • keywords changed from 確認中 to 差し戻し.
  • 定数 db_error_log は大文字にした方がいいでしょう
  • スペースの記述方法などコーディング規約に沿っていない箇所があります
  • エラーハンドラの登録は、PEAR::DBのインスタンスに対してのみおこないたいです

09/03/08 21:15:09 changed by ebihara

  • keywords changed from 差し戻し to 確認中.

r8184 で、エラーハンドラを OpenPNE_DB のコンストラクタで登録するように変更しました。また、コールバック関数を OpenPNE_DB::errorHandler() に変更しました。

r8185 で、エラーログのパスを、他のログにあわせて定数にしないように修正しました。

09/03/08 23:25:48 changed by ebihara

エラーの種類を区別せずにスクリプトの実行を停止してしまうのは問題だと思われるので、 r8193 でログの出力のみに限定するよう修正しました。

09/08/08 20:49:12 changed by kiwa

  • owner changed from nobody to kiwa.
  • status changed from new to assigned.

09/08/08 21:04:33 changed by ogawa

  • keywords changed from 確認中 to 差し戻し.
  • Descriptionを最新の情報にしてください
  • OpenPNE_Config が更新されていません

09/08/08 21:40:08 changed by ebihara

  • keywords changed from 差し戻し to 確認中.
  • description changed.

r8245 で修正しました。Description もあわせて書き換えました。

09/08/08 23:17:39 changed by ogawa

  • keywords changed from 確認中 to テスト待ち.

09/08/08 23:29:56 changed by kiwa

  • keywords deleted.
  • status changed from assigned to closed.
  • resolution set to fixed.

確認しました。問題なさそうです。