Как отправить 500 внутренних ошибок сервера ошибка из php-скрипта



мне нужно отправить "500 Внутренняя ошибка сервера" из PHP-скрипта при определенных условиях. Скрипт должен быть вызван сторонним приложением. Скрипт содержит пару die("this happend") заявления, для которых мне нужно отправить 500 Internal Server Error код ответа вместо обычного 200 OK. Сценарий третьей стороны повторно отправит запрос при определенных условиях, которые включают в себя не получение 200 OK код ответа.



вторая часть вопроса: мне нужно настроить мой сценарий, как это:



<?php
custom_header( "500 Internal Server Error" );

if ( that_happened ) {
die( "that happened" )
}

if ( something_else_happened ) {
die( "something else happened" )
}

update_database( );

// the script can also fail on the above line
// e.g. a mysql error occurred

remove_header( "500" );
?>


мне нужно отправить 200 заголовок только после выполнения последней строки.



Edit



побочный вопрос: Могу ли я отправить странные 500 заголовков, таких как эти:



HTTP/1.1 500 No Record Found
HTTP/1.1 500 Script Generated Error (E_RECORD_NOT_FOUND)
HTTP/1.1 500 Conditions Failed on Line 23


будут ли такие ошибки регистрироваться веб-сервером?

742   6  

6 ответов:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);

PHP 5.4 имеет функцию с именем http_response_code, Так что если вы используете PHP 5.4 вы можете просто сделать:

http_response_code(500);

Я написал polyfill для этой функции (Gist) если вы используете версию PHP под 5.4.


чтобы ответить на ваш последующий вопрос, HTTP 1.1 RFC говорит:

причина фразы, перечисленные здесь только рекомендации -- они могут быть заменено местными эквивалентами без влияния протокол.

это означает, что вы можете использовать любой текст, который вы хотите (за исключением возврата каретки или перевода строки) после самого кода, и он будет работать. Как правило, однако, обычно есть лучший код ответа для использования. Например, вместо использования 500 для записи не найдено, вы можете отправить 404 (не найдено), и для чего-то вроде "условия не удалось" (я предполагаю ошибку проверки), вы можете отправить что-то вроде 422 (unprocessable лица).

вы можете использовать следующую функцию для отправки изменения состояния:

function header_status($statusCode) {
    static $status_codes = null;

    if ($status_codes === null) {
        $status_codes = array (
            100 => 'Continue',
            101 => 'Switching Protocols',
            102 => 'Processing',
            200 => 'OK',
            201 => 'Created',
            202 => 'Accepted',
            203 => 'Non-Authoritative Information',
            204 => 'No Content',
            205 => 'Reset Content',
            206 => 'Partial Content',
            207 => 'Multi-Status',
            300 => 'Multiple Choices',
            301 => 'Moved Permanently',
            302 => 'Found',
            303 => 'See Other',
            304 => 'Not Modified',
            305 => 'Use Proxy',
            307 => 'Temporary Redirect',
            400 => 'Bad Request',
            401 => 'Unauthorized',
            402 => 'Payment Required',
            403 => 'Forbidden',
            404 => 'Not Found',
            405 => 'Method Not Allowed',
            406 => 'Not Acceptable',
            407 => 'Proxy Authentication Required',
            408 => 'Request Timeout',
            409 => 'Conflict',
            410 => 'Gone',
            411 => 'Length Required',
            412 => 'Precondition Failed',
            413 => 'Request Entity Too Large',
            414 => 'Request-URI Too Long',
            415 => 'Unsupported Media Type',
            416 => 'Requested Range Not Satisfiable',
            417 => 'Expectation Failed',
            422 => 'Unprocessable Entity',
            423 => 'Locked',
            424 => 'Failed Dependency',
            426 => 'Upgrade Required',
            500 => 'Internal Server Error',
            501 => 'Not Implemented',
            502 => 'Bad Gateway',
            503 => 'Service Unavailable',
            504 => 'Gateway Timeout',
            505 => 'HTTP Version Not Supported',
            506 => 'Variant Also Negotiates',
            507 => 'Insufficient Storage',
            509 => 'Bandwidth Limit Exceeded',
            510 => 'Not Extended'
        );
    }

    if ($status_codes[$statusCode] !== null) {
        $status_string = $statusCode . ' ' . $status_codes[$statusCode];
        header($_SERVER['SERVER_PROTOCOL'] . ' ' . $status_string, true, $statusCode);
    }
}

Вы можете использовать его как таковой:

<?php
header_status(500);

if (that_happened) {
    die("that happened")
}

if (something_else_happened) {
    die("something else happened")
}

update_database();

header_status(200);

можно просто написать:

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

в ваших условиях, как:

if (that happened) {
    header("HTTP/1.0 500 Internal Server Error");
}

как для запроса к базе данных, вы можете просто сделать это так:

$result = mysql_query("..query string..") or header("HTTP/1.0 500 Internal Server Error");

вы должны помнить, что вы должны поставить этот код перед любым тегом html (или выводом).

вы можете упростить его следующим образом:

if ( that_happened || something_else_happened )
{
    header('X-Error-Message: Incorrect username or password', true, 500);
    die;
}

он вернет следующий заголовок:

HTTP/1.1 500 Internal Server Error
...
X-Error-Message: Incorrect username or password
...

добавлено: Если вам нужно точно знать, что пошло не так, сделать что-то вроде этого:

if ( that_happened )
{
    header('X-Error-Message: Incorrect username', true, 500);
    die('Incorrect username');
}

if ( something_else_happened )
{
    header('X-Error-Message: Incorrect password', true, 500);
    die('Incorrect password');
}

ваш код должен выглядеть так :

<?php
if ( that_happened ) {
    header("HTTP/1.0 500 Internal Server Error");
    die();
}

if ( something_else_happened ) {
    header("HTTP/1.0 500 Internal Server Error");
    die();
}

// Your function should return FALSE if something goes wrong
if ( !update_database() ) {
    header("HTTP/1.0 500 Internal Server Error");
    die();
}

// the script can also fail on the above line
// e.g. a mysql error occurred


header('HTTP/1.1 200 OK');
?>

Я предполагаю, что вы остановить выполнение, если что-то пойдет не так.

Comments

    Ничего не найдено.