PHP स्क्रिप्ट से 500 आंतरिक सर्वर त्रुटि त्रुटि कैसे भेजें


81

मुझे कुछ शर्तों के तहत PHP स्क्रिप्ट से "500 आंतरिक सर्वर त्रुटि" भेजने की आवश्यकता है। स्क्रिप्ट को थर्ड पार्टी ऐप द्वारा बुलाया जाना चाहिए। स्क्रिप्ट में कुछ 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अंतिम पंक्ति निष्पादित होने के बाद ही हेडर भेजने की आवश्यकता है ।

संपादित करें

एक पक्ष का प्रश्न: क्या मैं इन जैसे अजीब 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

क्या ऐसी त्रुटियों को वेबसर्वर द्वारा लॉग इन किया जाएगा?


जब यू ने हेडर भेजा और बाद में हेडर हटा दिया गया तो यह
उल्लेखनीय नहीं है

1
पुन: प्रश्न: यह पूरी तरह से कानूनी है। कारण वाक्यांश मशीन की खपत के लिए अभिप्रेत नहीं हैं और वे कुछ भी हो सकते हैं। यह केवल तीन अंकों की स्थिति कोड है जो मायने रखता है। (RFC2616 6.1.1: "यहां दिए गए कारण वाक्यांश केवल सिफारिशें हैं - उन्हें प्रोटोकॉल को प्रभावित करने वाले स्थानीय समकक्षों द्वारा प्रतिस्थापित किया जाना चाहिए।")
पिस्कॉर ने 9

जवाबों:


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

FYI करें, यह समाधान X-Pad भेजता है: Apache के कुछ संस्करणों में ब्राउज़र बग हेडर से बचें। stackoverflow.com/questions/8711584/…http_response_code()इस हेडर को छोड़ देता है।
एंथनी रटलेज

3
अगर हेडर शुरुआत में नहीं है, तो भी काम करता है (जैसे कि काम करने का प्रमाण), अच्छी नौकरी।
मैं

कूल, क्या होगा यदि 500 ​​आंतरिक सर्वर त्रुटि के बजाय आउटपुट को एक json चाहिए?
tblancog

44

PHP 5.4 में एक फ़ंक्शन है जिसे http_response_code कहा जाता है , इसलिए यदि आप PHP 5.4 का उपयोग कर रहे हैं, तो आप कर सकते हैं:

http_response_code(500);

मैंने इस फ़ंक्शन (Gist) के लिए एक पॉलीफ़िल लिखा है यदि आप 5.4 के तहत PHP का संस्करण चला रहे हैं।


आपके अनुवर्ती प्रश्न का उत्तर देने के लिए, HTTP 1.1 RFC कहता है:

यहां सूचीबद्ध कारण वाक्यांश केवल सिफारिशें हैं - उन्हें प्रोटोकॉल को प्रभावित किए बिना स्थानीय समकक्षों द्वारा प्रतिस्थापित किया जाना चाहिए।

इसका मतलब है कि आप कोड के बाद अपने इच्छित पाठ (गाड़ी के रिटर्न या लाइन फीड को छोड़कर) का उपयोग कर सकते हैं और यह काम करेगा। आमतौर पर, हालांकि, आमतौर पर उपयोग करने के लिए एक बेहतर प्रतिक्रिया कोड होता है। उदाहरण के लिए, बिना किसी रिकॉर्ड के लिए 500 का उपयोग करने के बजाय , आप एक 404 (नहीं मिला) भेज सकते हैं , और "शर्तों में विफल" जैसी किसी चीज़ के लिए (मैं एक सत्यापन त्रुटि का अनुमान लगा रहा हूं), आप 422 की तरह कुछ भेज सकते हैं (अप्राप्य इकाई)।


यह ध्यान रखना महत्वपूर्ण है कि एक बार आउटपुट शुरू होने के बाद यह फ़ंक्शन भी काम नहीं करता है!
रोबा 8

@ rob74 True - एक बार PHP ने आउटपुट भेजना शुरू कर दिया है, सभी हेडर-संबंधित फ़ंक्शन अब काम नहीं करेंगे। यदि आप सुनिश्चित नहीं हैं कि यदि आप आउटपुट भेजना शुरू करने से पहले प्रतिक्रिया कोड को बदलना चाहते हैं, तो आउटपुट बफरिंग एक अच्छा समाधान है।
नशीला पदार्थ

34

स्थिति परिवर्तन भेजने के लिए आप निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं:

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

21
स्मृति के एक जोड़े बाइट्स को सहेजना शायद ही कभी वेब एप्लिकेशन कोड को एक या दूसरे तरीके से लिखने का एक अच्छा कारण है।
डैन ग्रॉसमैन

1
तुम एक के ;बाद याद नहीं कर रहे हैं die()?
हेनरी राइटिंग

2
आपकी सूची 418 => "मैं एक चायदानी" देख रहा हूं: en.wikipedia.org/wiki/Hyper_Text_Cfish_Pot_Control_Protocol
Louis Loudog Trottier

16

आप बस डाल सकते हैं:

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 टैग (या आउटपुट) से पहले डालना होगा।


11
हेडर कॉल करने के बाद सुनिश्चित करें कि आप बाहर निकलें / मरें / वापस जाएँ / कुछ करें ()। PHP कोड निष्पादित करेगा - जो शायद वांछनीय नहीं है।
डेविड गुडविन

8

आप इसे इस तरह सरल बना सकते हैं:

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

5
अब क्या 'x'माना जाए?
कोर Xii

1
+1 ध्यान दें कि पहला पैरामीटर headerगैर-रिक्त स्ट्रिंग होना चाहिए। यह 'x'वास्तव में बात नहीं है।
Theazureshadow

1
@ कोर Xii, पहला पैरामीटर शून्य नहीं होना चाहिए क्योंकि @theazureshadow ने बताया। संक्षेप में, हेडर ('कुछ', सत्य, 500) को कॉल करके, सही हेडर "HTTP / 1.0 500 आंतरिक सर्वर त्रुटि" वापस आ जाएगा। आप मुझे आलसी कह सकते हैं, लेकिन वास्तविक हेडर स्ट्रिंग को संभालने की तुलना में सिर्फ त्रुटि कोड पास करना आसान है :) अधिक जानकारी के लिए php.net/manual/en/function.header.php पर एक नज़र डालें ।
डेविड कुरिदिसा

इस बारे में मैनुअल बहुत स्पष्ट नहीं है। तो आप कह रहे हैं कि यदि आप स्थिति कोड को लागू करते हैं, तो PHP अपने सही मान पर स्ट्रिंग तर्क को अधिलेखित कर देता है? फिर मैनुअल यह क्यों कहेगा कि अगर स्ट्रिंग खाली नहीं है तो यह केवल प्रभावी होती है ?
कोर Xii

1
ध्यान दें कि कुछ PHP विन्यासों में (एक मेरा होस्टिंग प्रदाता एक्सैम्पल के लिए उपयोग करता है, लेकिन मेरा स्थानीय सेटअप नहीं) यह ट्रिक काम नहीं करेगा! अपाचे "x" को एक सही हेडर स्ट्रिंग के रूप में नहीं पहचानता है और एक "विकृत हेडर" त्रुटि के साथ विफल हो जाएगा।
mjsarfatti 12

2

आपका कोड जैसा दिखना चाहिए:

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

मुझे लगता है कि अगर कुछ गलत हो जाता है तो आप निष्पादन रोक देते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.