0


我正在开发一个 Web 应用程序,并且正在使用 PHP 和 javascript/jQuery,我遇到的问题是 XDebug 的警告/错误输出。我从 AJAX 调用 PHP 脚本来检索数据,其中大部分是返回数组,我使用 JSON 字符串进行传输。我遇到的问题是,如果有警告/错误 XDebug 在输出中写入 HTML 标记,并且当我尝试在我的 javascript 中解码 JSON 字符串时,它会失败。有没有办法配置 XDebug 将它们输出到变量中,这样我仍然可以在需要时显示它们而不会弄乱我的 JSON 解码?我试图展示一个简单的例子:

RemoveFile.php:

if (!unlink($_GET['Filename'])){ //if file not found XDebug will output warning here
    $errors[] = "File not found";

    echo json_encode($errors);    
}

RemoveFile.js:

function RemoveFile(filePath){
    $.get('RemoveFile.php', {
        Filename: filePath
    }).done(function (data){
        var dataArray = JQuery.parseJSON(data); //Fails if XDebug outputs HTML
    }
}

更新


我想出了我需要做什么,因为我不想打开日志文件来检查错误并在错误发生时显示错误以使调试更容易我创建了一个自定义错误处理程序以包含在文件中我不想输出错误,但仍然输出其他文件:

VarErrorHandler.php:

function VarErrorHandler($errno, $errstr, $errfile, $errline){
    switch ($errno) {
        case E_USER_ERROR:
            $errors[] = "ERROR: Fatal error on line $errline in file $errfile [$errno] $errstr";
            exit(1);
            break;

        case E_USER_WARNING:
            $errors[] = "WARNING: [$errno] $errstr";
            break;

        case E_USER_NOTICE:
            $errors[] = "NOTICE: [$errno] $errstr";
            break;

        default:
            $errors[] = "Unknown error type: [$errno] $errstr";
            break;
    }

    /* Don't execute PHP internal error handler */
    return true;
}

$old_error_handler = set_error_handler("VarErrorHandler");

所以现在在任何文件中我不想输出我添加的错误:

//include and set custom error handler
require_once("VarErrorHandler.php");

//to stuff here

//Reset original error handler
restore_error_handler();

然后通过显示错误数组将它们显示在客户端,即

function RemoveFile(filePath){
    $.get('RemoveFile.php', {
        Filename: filePath
    }).done(function (data){
        var dataArray = JQuery.parseJSON(data); //Fails if XDebug outputs HTML

        //Alert Errors
        alert(dataArray.errors.join("\n"));
    }
} 
4

1 回答 1

3

如果您的代码中有错误/警告/通知,那么它们的存在是有原因的 - 在您投入生产之前解决问题。

在生产环境中,您应该将 PHP 配置为记录错误而不是显示错误。在您php.ini的生产环境中:

error_log = /path/to/php-error.log
log_errors = On
display_errors = Off

或者,您可以在运行时更改代码中的设置:

ini_set("display_errors", 0);
ini_set("log_errors", 1);
ini_set("error_log", "/path/to/php-error.log");

在此处阅读更多信息:

在生产服务器上抑制 php 错误的最佳方法

于 2013-02-26T13:15:21.710 回答