0

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

有什么工具可以用来在服务器端检测或调试它吗?查看哪里发生错误或脚本中断?

4

2 回答 2

0

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

于 2013-04-27T20:55:06.883 回答
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 "";
    } 
    ?>
于 2013-04-27T21:06:14.497 回答