2011-01-28 16 views
14

मुझे अपने PHP पृष्ठ में निम्नलिखित अपवाद मिल रहा है।सोपफॉल्ट अपवाद: [HTTP] http शीर्षलेख प्राप्त करने में त्रुटि

SoapFault अपवाद: [HTTP] त्रुटि लाई जा रही है http हेडर

मैं लेख की जोड़ी पढ़ सकते हैं और default_socket_timeout विन्यास की जरूरत है कि पाया। इसलिए मैंने इसे अनुवर्ती के रूप में सेट किया। default_socket_timeout = 480

मुझे अभी भी एक ही त्रुटि मिल रही है। क्या कोई मेरी मदद कर सकता है?

उत्तर

-9

वेब सेवा के भीतर मेरी प्रक्रिया में से एक को निष्पादित करने में काफी समय लग रहा था। इसलिए मुझे साबुन का बहिष्कार मिल रहा था।

+1

और आप इसे ठीक करते हैं? मैं टाइमआउट बढ़ाने की कोशिश कर रहा हूं, लेकिन यह मदद नहीं करता है :(धन्यवाद – Dmitriy

+2

यह वास्तव में प्रश्न का उत्तर नहीं देता है। – Jeff

29

मैं दो कारणों के लिए Error fetching http headers हो रही किया गया है:

  1. सर्वर लंबे समय के जवाब देने के लिए समय लगता है।
  2. सर्वर Keep-Alive कनेक्शन (जो मेरा उत्तर कवर) का समर्थन नहीं करता है।

PHP हमेशा Connection: Keep-Alive HTTP शीर्षलेख भेजकर वेब सेवा के लगातार कनेक्शन का उपयोग करने का प्रयास करेगा। यदि सर्वर हमेशा कनेक्शन बंद कर देता है और ऐसा नहीं किया है (PHP को EOF प्राप्त नहीं हुआ है), तो आप Error fetching http headers प्राप्त कर सकते हैं जब PHP सर्वर कनेक्शन पर पहले से बंद कनेक्शन का पुन: उपयोग करने का प्रयास करता है।

नोट: इस परिदृश्य ही होगा एक ही SoapClient वस्तु एक से अधिक अनुरोध भेजता है और एक उच्च आवृत्ति के साथ है। पहले अनुरोध के साथ Connection: close HTTP शीर्षलेख भेजना यह तय करेगा।

PHP संस्करण 5.3.5 (वर्तमान में उबंटू के साथ वितरित) में HTTP शीर्षलेख Connection: Close सेट करने के लिए SoapClient द्वारा समर्थित नहीं है। एक एक धारा संदर्भ में HTTP शीर्ष लेख में भेजने के लिए सक्षम होना चाहिए ($option का उपयोग कर - SoapClient को तर्क के रूप में कुंजी stream_context), लेकिन SoapClient does not support changing the Connection header (अद्यतन: इस बग PHP संस्करण 5.3.11 में हल था)।

एक अन्य समाधान implement your own __doRequest() पर है। दिए गए लिंक पर, अनुरोध भेजने के लिए एक लड़का Curl का उपयोग करता है। यह आपके PHP अनुप्रयोग को Curl पर निर्भर करेगा। कार्यान्वयन में बचत अनुरोध/प्रतिक्रिया शीर्षलेख जैसी कार्यक्षमता भी अनुपलब्ध है।

एक तीसरा समाधान प्रतिक्रिया प्राप्त होने के तुरंत बाद कनेक्शन को बंद करना है। यह __doRequest(), __call() या __soapCall() में SoapClients विशेषता httpsocketNULL सेट करके किया जा सकता है। __call() साथ उदाहरण:

class MySoapClient extends SoapClient { 
    function __call ($function_name , $arguments) { 
     $response = parent::__call ($function_name , $arguments); 
     $this->httpsocket = NULL; 
     return $response; 
    } 
} 
+9

PHP 5.4 के बाद से यह ध्वज अब उपलब्ध है: keep_alive विकल्प एक बुलियन मान है जो कनेक्शन को भेजने के लिए परिभाषित करता है: रखें-एलीव हेडर या कनेक्शन: क्लोज़। (Http://www.php.net/manual/en/soapclient.soapclient.php) – heuri

+0

ऐसा लगता है कि इसे रोकने के लिए रखरखाव को बंद करने की आवश्यकता है; मुझे गलतफहमी हो सकती है चीजें, लेकिन क्या सर्वर प्रतिक्रिया यह इंगित नहीं करनी चाहिए कि कनेक्शन कितने समय तक जीवित रखा जा सकता है और फिर सोप क्लाइंट को पता होना चाहिए कि इसे बार-बार (और आदर्श रूप से, पारदर्शी रूप से फिर से कनेक्ट करें) के बाद इसका पुन: उपयोग नहीं करना चाहिए? –

+0

"सर्वर समर्थित नहीं है Keep-Alive कनेक्शन (जो मेरा उत्तर कवर करता है)। "मेरे पास एक बग्गी सर्वर था जिस पर मैं बात कर रहा था। यह Keep-Alive कनेक्शन को सही तरीके से संभाल नहीं पाया और मुझे इसे बंद करना पड़ा। – HNygard

1

मैं एक ही मुद्दा था और keep_alive को अक्षम करके निम्नलिखित की कोशिश की।

$api_proxy = new SoapClient($api_url, array('trace' => true, 'keep_alive' => false)); 

हालांकि, यह मेरे लिए काम नहीं करता है। मेरे लिए क्या काम किया गया था एसओएपी कैश को अक्षम करना।ऐसा लगता है कि गलत अनुरोधों को कैश किया गया है और अक्षम करने के बाद मैंने वास्तव में देखा कि मेरे अनुरोध तेजी से निष्पादित कर रहे थे।

लिनक्स सर्वर पर आप इसे अपने /etc/php.ini फ़ाइल में पा सकते हैं।

soap.wsdl_cache_enabled=1 के लिए देखो और इसे soap.wsdl_cache_enabled=0 पर बदलें।

अपाचे को फिर से लोड करना न भूलें। service httpd reload

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