Подтвердить что ты не робот

Как я могу заставить php возвратить 500, столкнувшись с фатальным исключением?

Неустранимые ошибки PHP возвращаются в качестве кода состояния 200 для HTTP-клиента. Как я могу заставить его вернуть код состояния 500 (Внутренняя ошибка сервера)?

4b9b3361

Ответ 1

header("HTTP/1.1 500 Internal Server Error");

Ответ 2

Это именно то, что было у меня вчера, и я нашел решение следующим образом:

1) Прежде всего, вам нужно уловить PHP фатальные ошибки, которые являются ошибкой E_ERROR. при возникновении этой ошибки script будет сохранена ошибка и прекратится выполнение. вы можете получить сохраненную ошибку, вызвав функцию error_get_last().

2) до завершения script, всегда будет вызываться функция обратного вызова register_shutdown_function(). поэтому вам необходимо зарегистрировать обработчик ошибок с помощью этой функции, чтобы сделать то, что вы хотите, в этом случае вернуть заголовок 500 и настраиваемую страницу внутренних ошибок (необязательно).

function my_error_handler()
{
  $last_error = error_get_last();
  if ($last_error && $last_error['type']==E_ERROR)
      {
        header("HTTP/1.1 500 Internal Server Error");
        echo '...';//html for 500 page
      }
}
register_shutdown_function('my_error_handler');

Примечание. Если вы хотите поймать собственный тип ошибки, который начинается с E_USER *, вы можете использовать функцию set_error_handler() для регистрации обработчика ошибок и запускать ошибку с помощью функции trigger_error, однако этот обработчик ошибок не может обрабатывать тип ошибки E_ERROR. см. объяснение на php.net о обработчик ошибок

Ответ 3

Я использовал "set_exception_handler" для обработки исключений uncaught.

function handleException($ex) {
      error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
      ob_end_clean(); # try to purge content sent so far
      header('HTTP/1.1 500 Internal Server Error');
      echo 'Internal error';
    }

set_exception_handler('handleException');

Ответ 4

Невозможно обрабатывать PHP E_ERROR любым способом в соответствии с документацией PHP: http://www.php.net/manual/en/function.set-error-handler.php

С помощью этой ссылки можно обрабатывать "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большую часть E_STRICT".

Вы можете предоставить обработчик для другой ошибки, предупреждения и уведомлений, включая E_USER_ERROR, но это действительно не так полезно, как кажется, поскольку эта ошибка только умышленно бросается программистом с помощью trigger_error().

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

Я согласен, что это проблема. Серверы НЕ должны возвращать 200 OK, когда код приложения сбой и ожоги.

Ответ 6

Вам придется поймать заброшенную ошибку, используя try/catch, а затем использовать этот блок catch для отправки header() с ошибкой 500.

try {
    ...badcode...
    throw new Exception('error');

} catch (Exception $e) {

    header("Status: 500 Server Error");
    var_dump($e->getMessage());
}

Если фатальное исключение не окружено try {} catch-блоками, тогда вы должны зарегистрировать глобальный обработчик и использовать register_shutdown_function() для проверки на ошибку в конце script.

Ответ 7

Никогда не забудьте установить header("HTTP/1.1 200 OK", true, 200); в качестве последней строки любого пути выполнения:

//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);


//Application code, includes, requires, etc. [...]


//somewhere something happens
//die();
throw new Exception("Uncaught exception!");


//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);

В PHP 5.4 вы можете заменить функцию header выше, тем лучше http_response_code(200) или http_response_code(500).

Ответ 8

Трудная вещь при работе с фатальными ошибками (ошибки компиляции, например отсутствующая точка с запятой) заключается в том, что script не будет выполняться, поэтому он не поможет установить код состояния в script. Однако, когда вы включаете или требуете script, вызов script будет выполнен, независимо от ошибок в включенном script. При этом я прихожу к этому решению:

рок-твердофазной script.php:

// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");

script -i-хочу-к-охранником-для-errors.php:

// do all the processsing
// don't produce any output
// you might want to use output buffering

http_response_code(200); // PHP >= 5.4

// here you can produce the output

Направьте свой звонок на rock-solid - script.php, и вы готовы к работе.

Мне бы лучше было установить код состояния по умолчанию на 500 в .htaccess. Это кажется мне более элегантным, но я не могу найти способ его снять. Я попытался RewriteRule R-флаг, но это предотвращает выполнение php вообще, так что не использовать.

Ответ 9

Стандартная конфигурация PHP делает возвращает 500 при возникновении ошибки! Просто убедитесь, что ваш display_errors = выключен. Вы можете имитировать его с помощью:

ini_set('display_errors', 0); 
noFunction();

По умолчанию директива display_errors отключена по умолчанию.