PHP4にて、Fatal Error や Warning や Notice が出た場合に管理者にメールを送る処理を書いています。


以下のような設定をしているのですが、どうも動きが怪しいのです。
set_error_handler("errorHandler");

メールが送信されてきたり、全く送られてこなかったりします。Googleで検索などして、1日原因を調べているのですが、何が原因でそうなるのかが全く掴めなく困ってしまいました。

現状、この辺があやしいと思っています。

1. set_error_handlerしているファイルでエラーでないと表示されない?
2. あちこちの利用しているクラスで、error_reporting(E_ALL); を設定していたりするとおかしくなる?
3. output_buffering = 4096 を設定するとhttpdを再起動してもおかしくなる?

こうなるとおかしくなる等、何かヒントを頂けないでしょうか?

環境は、CentOS 4.4, PHP 4.3.9です。

回答の条件
  • 1人5回まで
  • 登録:2007/04/13 23:27:25
  • 終了:2007/04/20 23:30:04

回答(4件)

id:guki No.1

もすぴー回答回数51ベストアンサー獲得回数12007/04/14 00:14:16

ポイント60pt

ヒントというより確認ですが、set_error_handlerしてるPHPは

各PHPで必ず require してるんですよね?

>メールが送信されてきたり、全く送られてこなかったりします。

これは何を見て判断しているのでしょうか?

エラーメールが来る、来ない時のエラーログの違いが分かると

答えやすいかもしれません。

あと一応、set_error_handler("errorHandler");で呼んでいる

errorHandler内部で、そもそもエラーになってないかも確認した方がよいと思います。

id:p_question

require_once で呼び出していて、エラーにもならないので、確実に読んでいます。

以下のシンプルな構成でもメールが飛びません。

tail -f /var/log/maillog は何も表示せず。

index.php

require_once('error_report.php');

aa <- わざとエラーを起こす。

(以下、色々な処理)

?>

以下、error_report.php

error_reporting(E_ALL);

function errorHandler ($errno, $errstr, $errfile, $errline){

$msg = 'TEST';

mail('root@localhost', 'Error TEST', $msg);

}

}

set_error_handler("errorHandler");

?>

あ、今調べていて、軽いエラーなら、送信されるようですが、上記のような、Parse Errorのものでは、送信されないです。もしかして、スクリプトが止まってしまうようなものは、ハンドリングできないのですか?

あと、index.php 以外のファイルで実行しているNotice なども反応しなくなります。

どういう範囲でエラーをハンドリングしてくれるのでしょうか?

2007/04/14 01:15:27

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 hallo22 31 29 0 2007-04-15 15:09:06
2 zebevogue 65 60 7 2007-04-16 05:52:41
3 もすぴー 51 34 1 2007-04-19 21:21:02
  • id:kurukuru-neko
    PHP Manual
    http://jp.php.net/set_error_handler

    以下のエラータイプは、
    ユーザ定義の関数では扱えません。
    E_ERROR, E_PARSE, E_CORE_ERROR,
    E_CORE_WARNING, E_COMPILE_ERROR,
    E_COMPILE_WARNING
    および set_error_handler() がコール
    されたファイルで発生した
    大半の E_STRICT


  • id:p_question
    なるほど、マニュアルは何回も読んだのですがようやく意味がわかりました。

    結局、E_ERROR,E_PARSEは、set_error_handler("errorHandler");では、扱えないのですね。

    これらをメールするとしたら、error_logに書き込まれたものをメールするという方法しかないのでしょうか?

    #ポイントを差し上げたいので、コメントではなく回答者の方で回答して頂けると助かります。
  • id:kurukuru-neko
    <?php

    function errorproc($errno, $errstr, $errfile, $errline){
    printf("errno=%d %s Line=%d\n",$errno,$errstr,$errline);
    if( function_exists('debug_print_backtrace') ) {
    debug_print_backtrace();
    };
    return true;
    };
    set_error_handler("errorproc");
    error_reporting(E_ALL);

    // $fns = get_defined_functions ();
    // print_r($fns);

    Fc;

    ab;
    printf("E_ERROR=%d\n",E_ERROR);
    trigger_error("ERROR !!",E_ERROR);

    printf("E_WARNING=%d\n",E_WARNING);
    trigger_error("WARN !!",E_WARNING);

    printf("E_PARSE=%d\n",E_PARSE);
    trigger_error("PARSE !!",E_PARSE);


    abz();

    printf("END \n");
    ~

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません