2017-01-02 1 views
0

Я использую AngularJs для одностраничного приложения и общаюсь с сервером PHP через JSON. Заголовок PHP устанавливает JSON, но сообщения об ошибках от PHP:Сообщить об ошибках PHP в формате JSON, соответствующих стандарту Content-type

php_flag display_errors 1 
php_flag display_startup_errors 1 
php_value error_reporting 32767 

является HTML, а не сопоставление типа содержимого заголовка регулярного ответа header('Content-Type: application/json;charset=utf-8');
Поэтому angularjs постоянно бросает на ошибках PHP. Должен ли я использовать multicontent types или что делать?

enter image description here

ответ

1

Если вы должны вернуть PHP ошибки/исключения на стороне клиента, который не рекомендуется (но я знаю, что это легче для развития), вам понадобится пользовательский error/uncaught- exception обработчик для PHP. Таким образом, вы можете настроить способ отображения ошибок/исключений.

Вот пример кода, который выводит ошибки и исключает исключения как объекты JSON.

// Set error handler 
set_error_handler('api_error_handler'); 

function api_error_handler($errno, $errstr) { 
    return api_error($errstr, $errno, 500);  
} 

// Set uncaught exceptions handler  
set_exception_handler('api_exception_handler'); 

function api_exception_handler($exception) { 
    return api_error($exception->getMessage(), $exception->getCode(), 500); 
} 

// Error/Exception helper 
function api_error($error, $errno, $code) { 
    // In production, you might want to suppress all these verbose errors 
    // and throw a generic `500 Internal Error` error for all kinds of 
    // errors and exceptions. 
    if ($environment == 'production') { 
     $errno = 500; 
     $error = 'Internal Server Error!'; 
    } 

    http_response_code($code); 
    header('Content-Type: application/json'); 

    return json_encode([ 
     'success' => false, 
     'errno' => $errno, 
     'error' => $error, 
    ]); 
} 

Но это еще не все; Поскольку пользовательские обработчики ошибок не могут обрабатывать фатальные ошибки, будут отображаться фатальные сообщения об ошибках. Вам необходимо отключить ошибки отображения с помощью вызова ini_set():

ini_set('display_errors', 0); 

Так как обрабатывать фатальные ошибки? Неустранимые ошибки могут быть устранены при завершении работы с register_shutdown_function(). В обработчике останова нам нужно получить последнюю информацию об ошибке с вызовом error_get_last(). Итак:

// Set shutdown handler 
register_shutdown_function('api_fatal_error_handler'); 

function api_fatal_error_handler() { 
    $error = error_get_last(); 

    if ($error && error_reporting() && $error['type'] === E_ERROR) { 
     return api_error($error['message'], E_CORE_ERROR, 500); 
    } 
} 

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

В конце концов, почему бы не использовать зрелый пакет обработчика ошибок/исключений вместо того, чтобы реализовать все эти? Встречайте Whoops.

2

Почему вы полагаться на PHP Error для вашего приложения? Если возможно, укажите часть кода, которая вызывает ошибку.

Вы не должны использовать PHP-ошибку, чтобы остановить приложение, вместо этого выполните чистый выход, если вам нужно вернуть результат JSON. Вы можете использовать шаблон try...catch или проверить утверждение, которое вызывает ошибку до фактического вызова (например, проверьте, можно ли продолжить выполнение).

Посмотрите здесь:

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

+0

Код в порядке, просто удобство просмотра ошибок php в разобранном json, чтобы увидеть какие-либо ошибки прямо внутри углового выражения. Хороший намек на утечку информации. – ItsmeJulian

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