2013-02-26 5 views
0


Я разрабатываю веб-приложение и использую PHP и javascript/jQuery. У меня проблема с выходом предупреждений/ошибок из XDebug. Я вызываю PHP-скрипты из AJAX для извлечения данных, и большинство из них возвращают массивы, которые я использую для передачи JSON-строк. Проблема в том, что если есть предупреждение/ошибка, XDebug пишет HTML-теги в выходном файле, и когда я пытаюсь декодировать строку JSON в моем javascript, это терпит неудачу. Есть ли способ настроить XDebug для вывода их в переменную, чтобы я мог отображать их, если мне нужно, без испорчения моего JSON-декодирования? Я попытался показать быстрый пример:PHP/XDebug вывести переменную?

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 
    } 
} 

Update


Я понял, что мне нужно делать, потому что я не хочу, чтобы открыть файл журнала для проверки ошибки и ошибки, отображаемые в момент их создания, чтобы облегчить отладку. Я создал собственный обработчик ошибок, чтобы включить в файлы, которые я не хотел выводить, но все же выводя их на другие файлы:

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")); 
    } 
} 
+0

Да жаль ... у меня есть толстые пальцы сегодня и выложены до того, как я закончил LOL –

ответ

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

+0

Спасибо Jaitsu ... Я сейчас на этапе отладки и пытаюсь найти ошибки/предупреждения/уведомления сейчас, прежде чем вступать в производство, поэтому я включил отображение на дисплее, не открывая журнал ошибок. –

Смежные вопросы