5

フロントエンド Web サイトでエラーを処理する最善の方法は何ですか? 素敵な「問題が発生しました」ページがある twitter や reddit などに似ています。したい:

  1. ログファイルだけであっても、エラーを検出して通知する
  2. 失敗したクジラなどのカスタム エラー ページを表示して、何も表示しない代わりに明らかに何かが間違っていることを示したり、ひどいエラーを表示したりします。

理想的には、致命的なエラー、カスタム例外、mysql のダウン、ランダムな 500 エラーなど、ユーザーがサイトを見るのを妨げるものはすべて、カスタム エラー ページを表示する必要があります。

致命的なエラー

PHP : カスタム エラー ハンドラ - 解析エラーと致命的エラーの処理 - 正常に動作しますが、これがスクリプトの最後で発生し、既に何かを出力している場合、これは動作しません

致命的でないエラー

http://davidwalsh.name/custom-error-handling-php

MySQL エラー

理想的には、単純なクエリ エラーから、サーバーが存在しないことまで、すべてをカバーする必要があります。データベースクラスでエラーを検出し、エラーメソッドへのリダイレクト/呼び出しを呼び出すのと同じくらい簡単だと想像してください

サーバー エラー

これは、 PHPまたはApacheまたはその両方で行うべきことですか?

現時点でのコード

現在、私は他のさまざまな SO の組み合わせから次のものを持っていますが、ページの残りの部分が読み込まれた後に致命的なエラーが報告されます。

上記のすべてで機能する何かのアイデアはありますか?

<?
function xhandler($number,$string,$file,$line,$context)
{
    //log to text file?
    //log to xml file?
    //store in database?
    //whatever you want to do!

    echo "<h1>here be dragons!</h1>";
    echo "$number,$string,$file,$line,$context";
    exit();
}

function fatal_handler() {
    $errfile = "unknown file";
    $errstr  = "shutdown";
    $errno   = E_CORE_ERROR;
    $errline = 0;

    $error = error_get_last();

    if( $error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];
    }

    echo "<h1>here be dragons!</h1>";
    print_r($error);
    exit();
}

register_shutdown_function( "fatal_handler" );
set_error_handler('xhandler',E_ALL);

include('show_the_content');

function_that_doesnt_exist();
echo $unterminated_line_of_code
?>
4

1 に答える 1

1

致命的なエラーをキャッチすることはできません。それらは致命的であり、スクリプトの実行は遭遇するとすぐに停止します。これらのエラーは、本番サイトでは表示されません。

実稼働環境 (ライブ サイト) では、通知と警告が HTML に表示されないようにする必要があります。

これらのサイトが通常行うことは、PHP で HTTP エラーを処理することです。これらのエラーを処理する PHP スクリプトにリダイレクトする必要があります。たとえば、Apache では、ErrorDocumentディレクティブを使用してこれを行います。これらのディレクティブ (HTTP エラー コードごとに 1 つ) は、サーバー構成または Web サイトのドキュメント ルートにある .htaccess ファイルに配置できます。

PHP スクリプトでは、必要に応じて、さまざまな HTTP エラーを でフィルタリングできます$_SERVER['REDIRECT_STATUS']。目的の HTTP エラーを含むリクエストを受け取った場合は、任意の方法で処理できます。

于 2013-11-13T17:57:05.503 に答える