PHP set_error_handler()関数の使用

12740 ワード

私たちがプログラムを書くと、問題が発生するのは避けられません(よく問題が発生します)、PHPがエラーに遭遇した場合、エラースクリプトの位置、行数、原因が与えられます.これは大したことではありません.確かに、デバッグ段階では、これは確かに何もありません.そして、エラーパスを与える必要があると思います.
しかし、実際の経路を漏らした結果は想像にたえないものであり、一部の侵入者にとって、この情報は非常に重要であり、実際には多くのサーバがこの問題を抱えている.一部のネットワーク管理者はPHPプロファイルのdisplayをいっそerrorsはOffに設定して解決していますが(私たちはそうしているようです)、本人はこの方法が消極的すぎると思います.
デバッグのためにPHPがエラーメッセージを返す必要がある場合があります.また、エラーが発生した場合、ユーザーに別のページにナビゲートする必要もあります.
では、どんな解決策があるのでしょうか.
set_error_handler()

PHPは4.1から.0からカスタムエラー処理ハンドルを提供する機能関数set_error_handler()ですが、スクリプト作成者は少数知っています.set_error_handlerという関数は誤った経路の漏洩をよく防止することができ,もちろん他にも多くの役割がある.
  • は、エラーをブロックするために使用することができる.エラーが発生すると、一部の情報がユーザーに漏れ、ハッカーがあなたのサイトを攻撃するツールになる可能性が高い.二つ目は、ユーザーにあなたのレベルが挫折していると感じさせます.
  • は誤った情報をメモし、生産環境の問題をタイムリーに発見することができる.
  • は対応する処理を行うことができ、エラーが発生したときに予め定義されたエラーページにジャンプし、より良いユーザー体験を提供することができる. 
  • はデバッグツールとして使用でき、生産環境で何かをデバッグしなければならない場合がありますが、使用しているユーザーに影響を与えたくない場合があります.
  • ....

  • set_error_handlerの使い方は以下の通りです.
    string set_error_handler ( callback error_handler [, int error_types])

    カスタムエラー処理で実際のパスをフィルタします.変数$adminがあると仮定し、アクセス者が管理者であるかどうかを判断するために使用されます(IPまたはログインしたユーザーidで判断できます).
    //admin         ,true    。 
    //               4     $errno,$errstr,$errfile,$errline,    。
    
    function my_error_handler($errno,$errstr,$errfile,$errline) 
    { 
         //               
        if(!admin) 
        { 
            $errfile=str_replace(getcwd(),"",$errfile); 
            $errstr=str_replace(getcwd(),"",$errstr); 
        } 
         switch($errno) 
        { 
            case E_ERROR: 
              echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) 
    "; echo " , 。"; // Error break; case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile)
    "; break; default: // Notice break; } }

    これでエラー処理関数がカスタマイズされますが、エラーの処理をこのカスタム関数に渡すにはどうすればいいのでしょうか.
    //      
    set_error_handler(array(&$this,"appError")); 
    //      
    set_error_handler("my_error_handler");  

    so easy,これにより,安全とデバッグの便利さの矛盾をうまく解決できる.また、Webサイトのスタイルに合わせて、エラーヒントをより美しくするために工夫することもできます.
    原作者は2つの注意すべき点を提供して、私も出して、広範な同胞たちの注意を引き起こすことを望んでいます:
  • E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNINGはこのハンドルでは扱われません.つまり、最も原始的な方法で表示されます.ただし、これらのエラーはコンパイルまたはPHPカーネルエラーであり、通常は発生しません.
  • set_を使用error_handler()後、error_Reporting()は無効になります.つまり、すべてのエラー(上記のエラーを除く)がカスタム関数処理に渡されます.
  • //       ,            ,  require()    
    function myErrorHandler($errno, $errstr, $errfile, $errline)  
    {  
         //      ,          ,            
        $errfile=str_replace(getcwd(),"",$errfile);  
        $errstr=str_replace(getcwd(),"",$errstr);  
      
        switch ($errno) {  
        case E_USER_ERROR:  
      
         echo "<b>My ERROR</b> [$errno] $errstr<br />
    "; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />
    "; echo "Aborting...<br />
    "; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />
    "; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />
    "; break; default: echo "Unknown error type: [$errno] $errstr<br />
    "; break; } /* Don't execute PHP internal error handler */ return true; } // MYSQL , MYSQL 3333, 3306。 $link_id=@mysql_pconnect("localhost:3333","root","password"); set_error_handler(myErrorHandler); if (!$link_id) { trigger_error(" ", E_USER_ERROR); }

    はい、まとめてみます.次はset_です.error_handlerの3つの使い方:
    class CallbackClass {  
       function CallbackFunction() {  
           // refers to $this  
       }  
      
       function StaticFunction() {  
           // doesn't refer to $this  
       }  
    }  
      
    function NonClassFunction($errno, $errstr, $errfile, $errline) {  
    }  
      
    //       :  
      
    1: set_error_handler('NonClassFunction');  //             NonClassFunction  
      
    2: set_error_handler(array('CallbackClass', 'StaticFunction')); //    CallbackClass        StaticFunction  
      
    3: $o =& new CallbackClass();  
        set_error_handler(array($o, 'CallbackFunction'));  //         ,              。  
      
    4. $o = new CallbackClass();  
      
      
    // The following may also prove useful:  
      
    class CallbackClass {  
       function CallbackClass() {  
           set_error_handler(array(&$this, 'CallbackFunction')); // the & is important  
       }  
         
       function CallbackFunction() {  
           // refers to $this  
       }  
    }