2010-08-05 11 views
7

मैं एक PHP अनुप्रयोग विकसित कर रहा हूं जो संचार के साथ-साथ प्रतिक्रिया निकायों के लिए HTTP प्रतिक्रिया कोड का उपयोग करता है। तो यह PHP कोड में एक विशिष्ट परिदृश्य है:PHP त्रुटि के मामले में अपाचे को 500 कैसे भेजने दें?

try { 
    doSomething(); 
} 
catch (Exception $e) { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 

... और ग्राहकों में विशिष्ट कोड लगता है:

switch(responseCode) { 
    case 200 : 
     // all fine 
     // .... 
    case 500 : 
     // trouble! 
} 

यह अच्छा है, जब तक कि हर त्रुटि अच्छी तरह से में फंस जाता है PHP कोड

समस्या: यदि, किसी भी कारण से PHP कोड में किसी भी त्रुटि के लिए एक त्रुटि त्रुटि या सिंटैक्स त्रुटियों की एक अचूक त्रुटि, अपाचे 200 ओके भेज देगा। लेकिन मैं 500 आंतरिक सर्वर त्रुटि कहने के लिए apache नहीं होगा। शायद प्रति। Htaccess या तो।

+1

के साथ मेरी खिड़कियां अपाचे 2.4 पर सही व्यवहार है बनाने के लिए निर्धारित करने की आवश्यकता क्यों JavaScript टैग? –

+0

एक बार जावास्क्रिप्ट क्लाइंट दिमाग में था। टैग हटा दिया गया। – hek2mgl

+0

क्षमा करें, मेरा उत्तर अपडेट किया गया। –

उत्तर

2

आप, write your own error handler कर सकते हैं। हालांकि, सभी PHP त्रुटियों को पकड़ने योग्य नहीं हैं। उदाहरण के लिए, एक वाक्यविन्यास त्रुटि आपके कोड को चलाने में भी अनुमति नहीं देगी, जिसमें आपके त्रुटि हैंडलर भी शामिल हैं।

आकर्षक त्रुटियों को संभालने के लिए, आप अपने त्रुटि हैंडलिंग कोड कोड को रखने के लिए auto_append_file और auto_prepend_file निर्देशों का उपयोग कर सकते हैं।

गैर-पकड़ने योग्य त्रुटियां एक अलग समस्या हैं। यदि PHP Fast CGI के रूप में चलता है, तो यह स्वचालित रूप से आपके लिए 500 स्थिति कोड उत्पन्न करेगा। हालांकि, आप शायद कुछ अन्य एसएपीआई (जैसे अपाचे मॉड्यूल) के माध्यम से PHP चला रहे हैं। इसके बारे में कोई जानकारी नहीं, क्षमा करें। (अगर मुझे कुछ मिल जाए तो मैं वापस रिपोर्ट करूंगा।)

+0

त्वरित उत्तर के लिए धन्यवाद! हां मैंने एक कस्टम त्रुटि- और अपवाद हैंडलर लिखा है, लेकिन आप सही हैं, अचूक त्रुटियां समस्या हैं। मैं इस पर गुगल रहा हूं .. – hek2mgl

+0

जो भी हो, यह असामान्य है कि ऐसी तरह की घातक त्रुटियां अनजान रहती हैं, है ना? –

+0

सिंटैक्स त्रुटियों और अन्य घातक त्रुटियों को किसी भी त्रुटि हैंडलर द्वारा पकड़ा नहीं जा सकता – stillstanding

2

प्रतिक्रिया शीर्षलेख PHP तक प्रतिक्रिया नहीं भेजे जाते हैं जब तक प्रतिक्रिया शरीर के पहले बाइट echoes। आप औसत समय में हेडर (और स्थिति कोड) बदल सकते हैं। इसे ध्यान में रखते हुए, यहां एक समाधान है:

स्क्रिप्ट की शुरुआत में 500 प्रतिक्रिया कोड और 200 अंत में भेजने के लिए अपनी स्क्रिप्ट सेट करें। यहाँ एक उदाहरण है:

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

if (rand(0, 1) == 1) { 
    die("Script terminated prematurely"); 
} 

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); 
echo "Success"; 

बस यह सुनिश्चित करें कि 200 प्रतिक्रिया कोड अपने कोड में केवल एक ही स्थान पर स्थापित किया जाएगा।

नोट: आप header के बजाय http_response_code (PHP> = 5.4) का उपयोग कर सकते हैं।

+0

अच्छा विचार +1 :) लेकिन यह अभी भी 200 ओके भेज देगा यदि उदाहरण के लिए एक (घातक) वाक्यविन्यास त्रुटि फेंक दी गई है। – hek2mgl

+0

कम से कम PHP> = 5.3.19 सिंटैक्स त्रुटियों वाली एक स्क्रिप्ट 500 त्रुटि उत्पन्न करती है। वैसे भी किसी भी उत्पादन सर्वर पर ऐसी कोई स्क्रिप्ट नहीं लेना चाहती है। –

2

आजकल यह कोई और अधिक एक समस्या है - के बाद से 5.3 पीएचपी पिछले पर सीखा है, त्रुटि पर 503 नहीं भेज करने के लिए 200

अरे, ऐसा लगता है यह 5.2.4 था:

बदला गया त्रुटि हैंडलर भेजने के लिए PHP त्रुटियों पर रिक्त पृष्ठ के बजाय HTTP 500।

आप display_errors = off यह काम

मैं PHP 5.4.5

+0

मैंने PHP 5.3.10 के साथ परीक्षण किया है। उदाहरण के लिए एक वाक्यविन्यास त्रुटि अभी भी 200 ओके में परिणाम देगा। किस परिस्थिति में PHP 503 भेज देगा? – hek2mgl

+0

आपका अपडेट बढ़िया लगता है !! लेकिन यह अभी भी मेरे लिए काम नहीं कर रहा है। मैंने PHP 5.3.10-1ubuntu3.4 के साथ परीक्षण किया है। मैंने एक सरल वाक्यविन्यास त्रुटि पृष्ठ ' hek2mgl

+0

@YourCommonSense, क्या 5.2.4 व्यवहार को अस्थायी रूप से ओवरराइड करने के तरीके मौजूद हैं, इसे PHP त्रुटियों पर एक खाली पृष्ठ दिखाने के लिए मजबूर किया गया है? – Pacerier

संबंधित मुद्दे