PHP / XDebug输出到变量?

时间:2013-02-26 13:06:54

标签: php javascript jquery json xdebug


   我正在开发一个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"));
    }
} 

1 个答案:

答案 0 :(得分: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");

在这里阅读更多相关信息:

Best way to suppress php errors on production servers