php - 如何在display_errors = 0且页面有错误时防止页面损坏?

时间:2011-09-15 09:29:28

标签: php crash custom-errors

晚上好,
如何设置自定义错误或防止页面损坏当display_errors = 0并且页面有错误并且我不知道'条件,代码等...'会导致这些错误?
例如,在此代码中:

<?php
    /////////////////////////////////////////////
        ini_set("display_errors" , "0");
    /////////////////////////////////////////////
        $html  = '
            <table>
                <tr>
                    <td><img src="img0.gif" /></td>
                    <td><img src="img1.gif" /></td>
                    <td><img src="img2.gif" /></td>
                </tr>
            </table>
        ';
    /////////////////////////////////////////////
        $dom   = new domDocument();
        $dom  -> loadHTML($html);
        $xpath = new domXPath($dom);
    /////////////////////////////////////////////
        $query   = $xpath->query('.//table/tr/td');
        $image   = $query->item(1000000000); // <<---- item number 
        $img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src'); 
        echo $img_src;
    /////////////////////////////////////////////
?>
该代码中的

因为没有item(1000000000),所以会导致错误。
并且会导致display_errors" , "0"所有错误被隐藏并且页面被损坏 那么,如何防止这种损害呢? 我知道我可以通过增加简单的条件来防止它,如: 在if( $image <1 ){ die('error msg'); } var之前$img_src 但是,如果我有一个更大的代码10000行,我不知道究竟什么代码会导致错误!! 我们可以通过httaccess阻止它吗?通过检查页面源是否为空重定向到错误页面。
或者我们可以通过php本身的某些功能来阻止它吗? 有任何想法吗 ?

2 个答案:

答案 0 :(得分:2)

您可以使用set_error_handler。要设置一个错误的回调离案例,可以在此处终止脚本执行。

<强>更新
刚发现自定义错误处理程序不适用于E_ERROR和其他错误类型。这是在PHP文档

  

使用用户定义无法处理以下错误类型   功能:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,   E_COMPILE_ERROR,E_COMPILE_WARNING和大多数E_STRICT在   调用set_error_handler()的文件。

所以这是我在互联网上找到的解决方法,我已经用你的脚本进行了测试,并且工作正常 将以下代码添加到脚本的开头:

// execute on shutdown
function shutdown_handle(){
    // get last error details if any
    $lerror = error_get_last();

    // if there is a Fatal (E_ERROR Type) las error then redirect to error page
    if($lerror && $lerror['type'] == E_ERROR)
        header('Location:error_page.php');
}
// register our shutdown handler
register_shutdown_function('shutdown_handle');

这将注册一个关闭函数,该函数在脚本终止时从致命错误执行,无论display_errors是打开还是关闭。

我们检查上一个错误是否是致命错误,如果是,我们将重定向到error_page.php。

注意:需要注意的一点是,如果display_errors为ON,则重定向仍然有效。我测试了它,它工作正常。这可能是因为我的服务器上启用了output_buffering。

更新2:
这是完整的PHP文件,其中包含添加了关闭处理程序的代码。这很好用,并重定向到error_page.php。将其更改为您要重定向到的页面:

<?php
    ////////////////////////////////////////////////
    // Shutdown handler to catch E_ERROR on shutdown 
    // even with display_errors OFF

    // function which will execute on shutdown
    function shutdown_handle(){
        // get last error details if any
        $lerror = error_get_last();

        // if there is a Fatal (E_ERROR Type) last error
        // then redirect to error page
        if($lerror && $lerror['type'] == E_ERROR)
            header('Location:error_page.php');
    }
    // register our shutdown handler
    register_shutdown_function('shutdown_handle');
    //////////////////////////////////////////////////

    /////////////////////////////////////////////
        ini_set("display_errors" , "1");
    /////////////////////////////////////////////
        $html  = '
            <table>
                <tr>
                    <td><img src="img0.gif" /></td>
                    <td><img src="img1.gif" /></td>
                    <td><img src="img2.gif" /></td>
                </tr>
            </table>
        ';
    /////////////////////////////////////////////
        $dom   = new domDocument();
        $dom  -> loadHTML($html);
        $xpath = new domXPath($dom);
    /////////////////////////////////////////////
        $query   = $xpath->query('.//table/tr/td');
        $image   = $query->item(1000000000); // <<---- item number 
        $img_src = $image->getElementsByTagName('img')->item(0)->getAttribute('src'); 
        echo $img_src;
    /////////////////////////////////////////////
?>

答案 1 :(得分:0)

如果要隐藏用户的所有错误,请启用error_reporting(以便仍然记录错误)并禁用display_errors。

如果您希望所有错误都是致命的(即停止页面处理),您可以设置一个自定义错误处理程序,该处理程序会因每个错误而死亡。