2009-11-18 19 views
42

बकाया पढ़ा डेटा के साथ बंद कर दिया जब कर्ल उपयोग करके किसी URL से डेटा प्राप्त करने, मैं कभी कभी (मामलों के 80% में) मिलकर्ल त्रुटि 18 - हस्तांतरण शेष

त्रुटि 18: हस्तांतरण शेष बकाया पढ़ा डेटा के साथ बंद

लौटाए गए डेटा का हिस्सा तब गायब है। अजीब चीज यह है कि ऐसा तब नहीं होता जब CURLOPT_RETURNTRANSFER को गलत पर सेट किया गया हो, यह curl_exec फ़ंक्शन डेटा वापस नहीं करता है लेकिन सामग्री को सीधे प्रदर्शित करता है।

समस्या क्या हो सकती है? क्या मैं ऐसे व्यवहार से बचने के लिए कुछ विकल्पों को सेट कर सकता हूं?

आपके सुझावों के लिए बहुत धन्यवाद!

+0

क्या आप हमें वह यूआरएल दे सकते हैं जो आप कोशिश कर रहे हैं, यदि आप अपने लोकहोस्ट पर इसका परीक्षण कर रहे हैं तो यह एक खराब कनेक्शन हो सकता है। –

+0

क्या आप 'कनेक्शन: बंद करें' हेडर भेज रहे हैं? यदि ऐसा है, तो 'कनेक्शन: Keep-Alive' और 'Keep-Alive' *** जैसे कुछ का उपयोग करने का प्रयास करें, जहां *** आपकी पसंद का एक नंबर है जो समझ में आता है (शायद 10 सेकंड, सुरक्षित होने के लिए; अधिकांश आधुनिक ब्राउज़र उपयोग करते हैं 300, जो 5 मिनट है)। – Dereleased

उत्तर

16

मुझे यकीन है कि यह एक गलत सामग्री-लंबाई सहकर्मी द्वारा भेजे गए हेडर से संबंधित है। मेरी सलाह है कि कर्ल को लंबाई निर्धारित करें।

+3

यह सामग्री-लंबाई प्रतिक्रिया शीर्षलेख से संबंधित हो सकता है।मुझे सहकर्मी परियोजनाओं में से एक में एक समान मामला सामने आया है: जावा webservice गेटवे सामग्री-लंबाई सेट करता है: 601 जबकि एक्सएमएल प्रतिक्रिया 210 बाइट्स – pcdinh

+0

है मेरा मानना ​​है कि @pcdinh सही है। हमें एक अनियंत्रित खंडित स्थानांतरण एन्कोडिंग के साथ मिल गया। कर्ल अधिक डेटा की उम्मीद कर रहा है (सर्वर ने अधिक भेजने की घोषणा की है या टर्मिनिंग 0 नहीं भेजा है), लेकिन सर्वर कनेक्शन बंद कर देता है। – iGEL

+2

कोई "सामग्री-लंबाई" शामिल नहीं है, उदाहरण संलग्न है। – MariuszS

3

मैं एक ही समस्या थी, लेकिन दबाने से इसे ठीक करने में कामयाब रहे 'की अपेक्षा: 100-जारी रखने के लिए' शीर्षक है कि कर्ल आमतौर पर भेजता है (निम्नलिखित PHP कोड है, लेकिन अन्य cURL API के साथ इसी तरह से काम करना चाहिए):

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:')); 

वैसे, मुझे लगता है कि JDK 6 बाकी सामान है, जो समस्याओं के सभी प्रकार है में शामिल है HTTP सर्वर के लिए कॉल भेज रहा हूँ। इस मामले में, यह पहले 100 प्रतिक्रिया भेजता है, और फिर कुछ अनुरोधों के साथ बाद में 200 प्रतिक्रिया सही ढंग से नहीं भेजती है।

+1

धन्यवाद, यह मेरे लिए काम किया। –

+0

हम इस सेटिंग को कहां संशोधित करेंगे? विंडोज़ में कर्ल होने पर मुझे नहीं पता कि यह लाइन कहां जोड़नी है। – DomainsFeatured

+0

@DomainsFeatured मुझे यकीन नहीं है कि "cURL विंडोज़ में है" से आपका क्या मतलब है, लेकिन कमांड लाइन पर, आप 'रिक्त:' हेडर को खाली मान देकर दबा सकते हैं: 'curl -H' अपेक्षा: '। .. 'मुझे उम्मीद है कि यह मदद करता है ... –

35

त्रुटि स्ट्रिंग काफी बस बिल्कुल libcurl क्या देखता है: क्योंकि यह एक chunked एन्कोडिंग धारा यह जानता है डेटा एक हिस्सा में छोड़ दिया प्राप्त करने के लिए नहीं है जब प्राप्त कर रहा है। जब कनेक्शन बंद हो जाता है, libcurl जानता है कि अंतिम प्राप्त हिस्सा अपूर्ण था। फिर आपको यह त्रुटि कोड मिलता है।

आप कुछ और नहीं अनुरोध असंशोधित के साथ इस त्रुटि से बचने के लिए क्या कर सकते हैं, लेकिन आप बजाय (के बाद से chunked एन्कोडिंग तो नहीं होगा) एक HTTP 1.0 अनुरोध जारी करके उसके चारों ओर काम करने के लिए कोशिश कर सकते हैं लेकिन तथ्य यह है कि है यह सर्वर में या किसी भी तरह से आपके नेटवर्क/सेटअप में एक दोष है।

+1

मेरे लिए, समस्या एक दूरस्थ अंत मैं पर कोई नियंत्रण नहीं था पर था और केवल काम कर ठीक इस के साथ 1.0 के लिए मजबूर किया गया था: curl_setopt ($ कर्ल, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); –

+0

@DanielStenberg अभी भी एक ही समस्या है। –

+0

HTTP वर्क सेट करना। 1.0 ने मुझे पुनर्प्राप्त डेटा में दिखाई देने वाले चंकित एनकोइंग और अजीब हेक्स अंकों के साथ मदद की। इस संकेत के लिए बहुत बहुत धन्यवाद! – Givi

0

मैंने इस त्रुटि को इस तरह से हल किया है।

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, 'http://www.someurl/'); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 30); 
ob_start(); 
$response = curl_exec ($ch); 
$data = ob_get_clean(); 
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200) success; 

त्रुटि अभी भी होती है, लेकिन मैं चर में प्रतिक्रिया डेटा को संभाल सकता हूं।

1

मैं यह त्रुटि आई जब मेरे सर्वर प्रक्रिया प्रतिक्रिया पैदा करने के दौरान एक अपवाद रास्ते के मध्य में हो गया और बस अलविदा कहने के बिना कनेक्शन बंद कर दिया। कर्ल अभी भी कनेक्शन से डेटा की उम्मीद की और शिकायत (सही ढंग से)।

1

मैं इस समस्या pycurl के साथ काम करने के लिए किया था और मैं का उपयोग कर

c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0) 

Eric Caron की तरह कहते हैं इसे हल।

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