简体   繁体   English

如何从 PHP 脚本发送 500 Internal Server Error 错误

[英]How to send 500 Internal Server Error error from a PHP script

I need to send "500 Internal Server Error" from an PHP script under certain conditions.在某些情况下,我需要从 PHP 脚本发送“500 内部服务器错误”。 The script is supposed to be called by a third party app.该脚本应该由第三方应用程序调用。 The script contains a couple of die("this happend") statements for which I need to send the 500 Internal Server Error response code instead of the usual 200 OK .该脚本包含几个die("this happend")语句,我需要发送500 Internal Server Error响应代码而不是通常的200 OK The third party script will re-send the request under certain conditions which include not receiving the 200 OK response code.第三方脚本会在某些情况下重新发送请求,包括未收到200 OK响应代码。

Second part of the question: I need to setup my script like this:问题的第二部分:我需要像这样设置我的脚本:

<?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" );
?>

I need to send 200 header only after the last line has been executed.仅在执行最后一行后,我才需要发送200标头。

Edit编辑

A side question: can I send strange 500 headers such as these:一个附带问题:我可以发送奇怪的 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

Will such errors get logged by the webserver?网络服务器会记录此类错误吗?

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

PHP 5.4 has a function called http_response_code , so if you're using PHP 5.4 you can just do: PHP 5.4 有一个名为http_response_code的函数,所以如果你使用 PHP 5.4,你可以这样做:

http_response_code(500);

I've written a polyfill for this function (Gist) if you're running a version of PHP under 5.4.如果您运行的是 5.4 以下的 PHP 版本,我已经为此函数(Gist) 编写了一个polyfill


To answer your follow-up question, the HTTP 1.1 RFC says:为了回答您的后续问题,HTTP 1.1 RFC 说:

The reason phrases listed here are only recommendations -- they MAY be replaced by local equivalents without affecting the protocol.这里列出的原因短语只是建议——它们可以被本地等效替换而不影响协议。

That means you can use whatever text you want (excluding carriage returns or line feeds) after the code itself, and it'll work.这意味着您可以在代码本身之后使用您想要的任何文本(不包括回车或换行),它会起作用。 Generally, though, there's usually a better response code to use.不过,通常情况下,通常有更好的响应代码可供使用。 For example, instead of using a 500 for no record found, you could send a 404 (not found), and for something like "conditions failed" (I'm guessing a validation error), you could send something like a 422 (unprocessable entity).例如,您可以发送404 (未找到),而不是使用500表示未找到记录,而对于诸如“条件失败”(我猜是验证错误)之类的内容,您可以发送类似422 (无法处理的实体)。

You may use the following function to send a status change:您可以使用以下函数发送状态更改:

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

You may use it as such:你可以这样使用它:

<?php
header_status(500);

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

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

update_database();

header_status(200);

You can just put:你可以只放:

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

inside your conditions like:在您的条件中,例如:

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

As for the database query, you can just do that like this:至于数据库查询,你可以这样做:

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

You should remember that you have to put this code before any html tag (or output).您应该记住,您必须将此代码放在任何 html 标记(或输出)之前。

You can simplify it like this:你可以像这样简化它:

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

It will return following header:它将返回以下标题:

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

Added: If you need to know exactly what went wrong, do something like this:补充:如果您需要确切知道出了什么问题,请执行以下操作:

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');
}

Your code should look like:您的代码应如下所示:

<?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');
?>

I assume you stop execution if something goes wrong.如果出现问题,我假设您停止执行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM