5

サーバー上で実行されている Web サイトに統合され、エラー バッチなどをメールで送信するエラー ログ サービスを作成しています。

そのため、致命的なエラーと解析エラーを処理する方法があるかどうかを調べようとしましたが、PHP コード (出力バッファー、シャットダウン関数) でそれを処理するためのトリックを使用していません。PHPコードの外でCコードまたはそれを処理する何かを書くことができてとてもうれしいです。可能であれば、リダイレクトも発行したいと思います (私のサイトは出力バッファリングを使用しているため、ヘッダーが送信されることはありません)。

これは PHP モジュールを使用して実行できると確信していますが、作成したことがなく、どこから始めればよいかわかりません。

4

2 に答える 2

3

PHP で致命的なエラーや解析エラーをキャッチする方法はありません。しかし..

5.2 では、error_get_last()が追加されました。シャットダウン関数内で呼び出して、ロギングを実行できます。致命的なエラーが発生したときにメールを送信する未テストの 5.3 の例:

<?php
register_shutdown_function(function(){
    $err = error_get_last();
    if(is_array($err) && array_key_exists('type', $err) $err['type'] > 0 
      && ($err['type'] == E_ERROR || $err['type'] == E_PARSE) {
        error_log("Oh noes, a fatal: " . var_export($err, true), 1, 'fatals@example.com');
    }
});

(5.3 を使用しておらず、無名関数を実行できない場合は、コールバックを使用する必要があります。)

残念ながら、これはシャットダウン関数で処理されるため、ヘッダーが既に発行されている可能性があり、ユーザーに役立つものを提供できない可能性があります。ただし、これはアプリケーションの残りの部分に依存するため、うまくいく可能性があります。試してみてください!

于 2010-06-07T18:40:18.833 に答える
1

デフォルトでは、すべてのエラーは Web サーバーのエラー ログに渡されますが、php.ini でerror_log 設定を介して独自のファイルへのパスを指定することで変更できます。したがって、やるべきことは、解析/データの送信/ログファイルの切り捨て/毎日/なんでもするために、いくつかの個別のスクリプト/アプリを作成し、それをcronジョブとして実行することです。

于 2010-06-07T20:12:09.930 に答える