PHP set_error_handler()関数使用の詳細(例)

4476 ワード

私たちがプログラムを書くと、問題が発生するのは避けられません(よく問題が発生します)、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  
        exit; 
        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つの注意すべき点を提供して、私も出して、広範な同胞たちの注意を引き起こすことを望んでいます:
1、E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNINGはこのハンドルでは扱われません.つまり、最も原始的な方法で表示されます.ただし、これらのエラーはコンパイルまたはPHPカーネルエラーであり、通常は発生しません.
2、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 "My ERROR [$errno] $errstr

"; 
        echo "  Fatal error on line $errline in file $errfile"; 
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")

"; 
        echo "Aborting...

"; 
        exit(1); 
        break; 

    case E_USER_WARNING: 
        echo "My WARNING [$errno] $errstr

"; 
        break; 

    case E_USER_NOTICE: 
        echo "My NOTICE [$errno] $errstr

"; 
        break; 

    default: 
        echo "Unknown error type: [$errno] $errstr

"; 
        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);