2013-04-18 17 views
9

サイトに内部サーバーエラーが発生したときに情報を収集しようとしています。適切なエラーログが設定されていないアプリケーションが数多くあります。問題が発生した場合、クライアントは当社に最適な情報を提供しません。 (ユーザーがページに関連付けられている 500エラーでフォームデータを取得

  • のすべてのデータにあった

    • ページ$を:私は何をしたいのは、500が発生したとき、私は問題のような起こった場所についてのデータを収集したいということです_GET、$ _POST、など)私は、次の設定で(7 IIS)当社のサーバー上のカスタムエラーページを設定した

    :私はちょうどvar_dump-だ

    <?xml version="1.0" encoding="UTF-8"?> 
    <configuration> 
        <system.webServer> 
         <httpErrors errorMode="Custom"> 
          <remove statusCode="500" /> 
          <error statusCode="500" path="/error.php?code=500" responseMode="ExecuteURL" /> 
         </httpErrors> 
        </system.webServer> 
    </configuration> 
    

    そして、そのページの$ _POSTと$ _GETを行うoそれらの中の何かがエラーページに通っているかどうかを確認しますが、そうではありません。 500エラーの私の目標は、次のようになります。

    収集したデータを含む問題についてチームをサポートするためにメールを送信エラー

  • 時のページ/ユーザに関するデータを収集する方法はありますそのデータを収集し、カスタムエラーページに表示されますか?

    error.php:すべてのケース$ _POST、私はこのエラーを取得するためのフォームを提出していても空で、$ _GETで

    switch($ErrorCode){ 
        case '500': 
         var_dump($_REQUEST, $_POST, $_GET); 
         echo "internal server error"; 
         break; 
    } 
    

    は(理にかなっている)、これを含んでいます

    array(2) { 
        ["code"]=> 
        string(3) "500" 
        ["500;http://icom-sbs/test_php"]=> 
        string(0) "" 
    } 
    

    4/19更新

    私はいくつかのアイデアを持ち、メイン変数は有用なデータをセッション変数に格納しています。エラーを返すテストページのセッション変数にフォームデータを格納しようとしましたが、セッションに入ることはありません。サーバー上でエラーが発生したことをサーバーが検出して、ページ上のコードを実行しないで、すぐにエラーページを実行するように見えるようです。

  • +0

    'error.php'ファイルからコードを投稿できますか? – pilsetnieks

    +0

    コードとページ応答が追加されました。 –

    +0

    多分これは助けになるでしょう:http://stackoverflow.com/questions/744418/how-to-log-http-requests-coming-into-iis –

    答えて

    2

    をスキップします確信していますこれはコード内に致命的なエラーが発生したことを意味します。単純なタイプミスから実行時間制限に至るまで、何でもよいでしょう。

    PHPの致命的なエラーをキャッチする最も良い方法は、register_shutdown_functionです。

    // put handling function at the very beginning 
    function handle_fatal() {/*...*/} 
    register_shutdown_function('handle_fatal'); 
    
    // now do some logic 
    if($_GET['page'] == 'dupa'){ 
        $_POST['subpage'] = 1; // more and more logic 
        $obj = new Dupa(); // class not found exception 
    } 
    

    これは私が例から私のhandle_fatalで得るものです::

    function handle_fatal() { 
        $error = error_get_last(); // PHP 5.2+ 
        if($error !== NULL){ 
         $error_landing_page = '[FATAL] '.$error['message'].' in '.$error['file'].':'.$error['line'] . '<br/>GET:<br/>' . print_r($_GET, true) . '<br/>POST:<br/>' . print_r($_POST, true); 
         // mail here if you need that and include $_GET, $_POST variables - this will be the last state before error occurred 
         exit($error_landing_page); 
        } 
    } 
    
    register_shutdown_function('handle_fatal'); 
    

    簡単なテスト・ケース:あなたは、あなたの作業ファイルの上で定義する必要があり、すべての後

    [FATAL] Class 'Dupa' not found in /var/www/index.php:22 
    GET: 
    Array ([page] => dupa) 
    POST: 
    Array ([subpage] => 1) 
    

    ますそのようなエラーをキャッチすることがnot always best ideaであることを知っている必要があります。注意する必要があります。

    +0

    これはまさに私が探していたようです。潜在的な問題をありがとう、私はそれらを念頭に置いておきます。 –

    0

    興味のあるものがあれば$_SERVERアレイをチェックしてください。

    ASPを使用している場合、エラーの詳細をServer.GetLastErrorに取得すると、IISが$_SERVERアレイを介して情報を渡す可能性があります。

    +0

    私はPHPを使用しています。 REQUEST_URIを使用してページを取得できますが、必要なその他の有用なデータはありません。 –

    +0

    私が知っているのは、IISが情報をASPに渡すということです。そのため、PHPに情報を与えるために '$ _SERVER'配列を使用するかもしれません。 – akirk

    0

    PHPでカスタムエラーハンドラを設定できると思います。難しいのは、いくつかのエラーがPHPを死に至らせ、エラーハンドラを起動せずに500を返す可能性があるということです。プラスの面は、多くの変更を加えることなく、サイト全体を簡単に実装できることです。

    http://www.php.net/manual/en/function.set-error-handler.php

    あなたは$ _SERVERグローバルにおける関連情報のほとんどを見つけることができるはずです。また、スタックトレースを与えるdebug_backtrace関数をチェックアウトすることもできます。

    http://php.net/manual/en/function.debug-backtrace.php

    幸運

    2

    私はあなたが500内部エラーが発生したときに、PHPでも初期化されないことがありますから、サーバレベルではなく、PHPのレベルで詳細を記録する必要があると思います。 Apacheを使用している場合は、

    http://httpd.apache.org/docs/1.3/mod/mod_log_config.html#logformat

    をチェックアウトすることができますエラーログは間違いなく、あなたがURLを要求するリモートアドレスを提供してのparams(クエリ文字列)を取得します。しかし、ポストデータについてはわかりません。ある種のレベルでヘッダーと生データ全体をダンプするために、ログフォーマットにいくつかの変更を加えることができるかもしれません。

    しかし、私は、サーバーが実際にあきらめ、PHPがでキックしていない場合、サーバーは、PHPファイルを解釈するために開始し、この500エラーが発生した後ならば、PHPレベルでのロギングは...特定の時間に

    関連する問題