如何检测服务器关闭连接的位置?

时间:2013-04-27 20:37:14

标签: php apache debugging httpresponse

服务器端代码(PHP)出错,我知道该文件,但由于没有任何错误消息,因此调试非常困难。所有我看到的是响应头返回:连接:关闭。没有日志或任何东西

我可以使用任何工具在服务器端检测或调试吗?要查看错误发生的位置或脚本中断?

2 个答案:

答案 0 :(得分:0)

您可以在您认为脚本可能失败的关键区域之前手动输入一些 echo 语句。尝试将 error_reporting(E_ALL); 放在脚本的顶部。

答案 1 :(得分:0)

我在包含文件中有以下代码(略微修改此代码以删除自定义代码)。 您可以使用它将错误消息记录到数据库。它使用类来处理数据库交互,但您可以将其更改为您自己的实现。或者将其记录到文件中。

它还会向浏览器输出信息,但您也可以在生产环境中将其丢弃。

    <?php
    set_error_handler("ErrorHandler"); 
    register_shutdown_function('ShutdownHandler');

    function ShutdownHandler() {
                    $error = error_get_last();
                    if($error !== NULL){
                            switch ($error['type']) {
                                case E_WARNING:exit;
                            }
                            $context = get_defined_vars();
                            ErrorHandler($error['type'],'(SHUTDOWN) ' . $error['message'], $error['file'],$error['line'],$context);
                    }
            }

    function ErrorHandler($error_level,$error_message, $error_file,$error_line,$error_context) 
    {
        $msg = "";
        $type = FriendlyErrorType($error_level);

        switch ($error_level) {
            case E_USER_ERROR:
                    $msg .= "<div style='border:1px solid #F00;padding:10px;margin:10px;'>";
                    $msg .= "<h1>Error</h1>";   
                    $msg .= "<p><b>[".$error_level."]</b>: ". $error_message . "</p>";
                    $msg .= "<p><b>File</b>: ". $error_file . "<br/>";
                    $msg .= "<b>Line</b>: ". $error_line . "</p></div>";

            case E_USER_WARNING:
                    $msg .= "<p>Warning -> <b>[".$error_level."]</b>".$error_file." on line ". $error_line .": ". $error_message . "</p>";
                    break;

            case E_USER_NOTICE:
                    $msg .= "<p>Notice -> <b>[".$error_level."]</b>".$error_file." on line ". $error_line .": ". $error_message . "</p>";
                    break;

            default:
                    $msg .= "<p>".$type." -> <b>[".$error_level."]</b>".$error_file." on line ". $error_line .": ". $error_message . "</p>";
                    break;
        }

        $context = print_r($error_context, true);
        $sVars = print_r($_SERVER, true);
        $pVars = print_r($_POST, true);
        $qVars = print_r($_GET, true);

        //add to database
        //custom class to add info to a database. You need to alter this to your own INSERT method.
        //ct2database::query("INSERT INTO ct2_errors (`DateCreated`,`Type`,`Level`,`Message`,`Line`,`File`,`Context`,`ServerVars`,`PostVars`,`QueryVars`) VALUES ('$1','$2','$3','$4','$5','$6','$7','$8','$9','$10')", MysqlDate(), $type, $error_level,$error_message,$error_line,$error_file,$context, $sVars, $pVars, $qVars);

        if ($error_level == E_USER_ERROR)
            exit;
    }

    function FriendlyErrorType($type)
    {
            switch($type)
            {
                    case E_ERROR: // 1 //
                            return 'E_ERROR';
                    case E_WARNING: // 2 //
                            return 'E_WARNING';
                    case E_PARSE: // 4 //
                            return 'E_PARSE';
                    case E_NOTICE: // 8 //
                            return 'E_NOTICE';
                    case E_CORE_ERROR: // 16 //
                            return 'E_CORE_ERROR';
                    case E_CORE_WARNING: // 32 //
                            return 'E_CORE_WARNING';
                    case E_CORE_ERROR: // 64 //
                            return 'E_COMPILE_ERROR';
                    case E_CORE_WARNING: // 128 //
                            return 'E_COMPILE_WARNING';
                    case E_USER_ERROR: // 256 //
                            return 'E_USER_ERROR';
                    case E_USER_WARNING: // 512 //
                            return 'E_USER_WARNING';
                    case E_USER_NOTICE: // 1024 //
                            return 'E_USER_NOTICE';
                    case E_STRICT: // 2048 //
                            return 'E_STRICT';
                    case E_RECOVERABLE_ERROR: // 4096 //
                            return 'E_RECOVERABLE_ERROR';
                    case E_DEPRECATED: // 8192 //
                            return 'E_DEPRECATED';
                    case E_USER_DEPRECATED: // 16384 //
                            return 'E_USER_DEPRECATED';
            }
            return "";
    } 
    ?>