2010-12-21 11 views
5

पूरे खोज के बाद, मुझे समझ में नहीं आ रहा है कि रिमोट एसएसएल-सक्षम होस्ट को जारी किए गए कर्ल अनुरोध क्यों मेरे मामले में केवल 50% या उससे अधिक सफल होते हैं। यहां स्थिति है: मेरे पास कर्ल अनुरोधों का अनुक्रम है, उनमें से सभी एक एचटीटीपीएस रिमोट होस्ट को जारी किए गए हैं, एक PHP स्क्रिप्ट के भीतर जो मैं PHP सीएलआई का उपयोग कर चलाता हूं। कभी-कभी जब मैं स्क्रिप्ट अनुरोध सफलतापूर्वक निष्पादित, लेकिन किसी कारण से समय की सबसे मैं इसे चलाने चलाने मैं cURL से निम्न त्रुटि मिलती है:curl/PHP अनुरोध समय का 50% निष्पादित करता है

* About to connect() to www.virginia.edu port 443 (#0) 
* Trying 128.143.22.36... * connected 
* Connected to www.virginia.edu (128.143.22.36) port 443 (#0) 
* successfully set certificate verify locations: 
* CAfile: none 
    CApath: /etc/ssl/certs 
* error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac 
* Closing connection #0 

अगर मैं फिर से कई बार मैं एक ही परिणाम प्राप्त करने की कोशिश, लेकिन फिर कुछ प्रयास करने के बाद अनुरोध सफलतापूर्वक हो जाएंगे। उसके बाद स्क्रिप्ट को फिर से चलाने में त्रुटि होती है, और पैटर्न जारी रहता है। त्रुटि 'चेतावनी खराब रिकॉर्ड मैक' की खोज करने से मुझे कुछ भी मदद नहीं मिली, और मैं एसएसएल मुद्दे पर दोष लगाने में संकोच करता हूं क्योंकि स्क्रिप्ट अभी भी कभी-कभी चलती है।

मैं उबंटू सर्वर 10.04 पर हूं, php5 और php5-curl स्थापित के साथ-साथ openssl का नवीनतम संस्करण भी है। कर्ल विशिष्ट विकल्पों के संदर्भ में, CURLOPT_SSL_VERIFYPEER को गलत पर सेट किया गया है, और CURLOPT_TIMEOUT और CURLOPT_CONNECTTIMEOUT दोनों को 4 सेकंड पर सेट किया गया है। इस समस्या को और बताते हुए यह तथ्य है कि मेरी मैक ओएस एक्स देव मशीन पर एक ही सटीक स्थिति होती है - अनुरोध केवल समय के ~ 50% के माध्यम से जाते हैं।

+0

आप Google "त्रुटि 140 9 43 एफसी" –

+0

पर विश्वास करना चाहते हैं, मैंने किया। मैं भी (मैं पहले से ही prefork चल रहा हूँ तो यह मदद नहीं की) यकीन है कि मैं prefork एम पी एम में अपाचे चल रहा था के रूप में वहाँ जाहिरा तौर पर इस कार्यकर्ता की वजह से संबंधित एक बग है के बाद से कार्यकर्ता धागे के लिए विरोध करने के लिए जाँच की संस्करण सूत्र। – mquinn

+2

खराब रिकॉर्ड मैक नेटवर्क इंटरफ़ेस के मैक पते का संदर्भ नहीं देता है। यह "संदेश प्रमाणीकरण कोड" –

उत्तर

3

रिमोट होस्ट शायद वास्तविक अद्वितीय होस्ट नहीं है। हो सकता है कि आने वाले अनुरोधों को लेकर कई सर्वरों के साथ लोड संतुलन समाधान हो। मुझे क्या लगता है कि यह त्रुटि संदेश में 'मैक त्रुटि' हो सकता है। इसका मतलब यह हो सकता है कि रिमोट होस्ट मैक पता बदल गया है जबकि एसएसएल निरसन अभी भी चल रहा था। और यह समझा सकता है कि कभी-कभी आपको कोई समस्या नहीं होती है।

लेकिन शायद नहीं :-) एसएसएल समस्याओं को खोजने में काफी मुश्किल है।

मैं प्रीफ़र्क एमपीएम बनाम वर्कर एमपीएम पर आपका उत्तर नहीं समझता, अगर आप क्लिप मोड में PHP चलाते हैं तो आपके अपाचे एमपीएम का उपयोग नहीं किया जाता है, आप अपाचे का उपयोग भी नहीं कर रहे हैं।

+0

अच्छी बिंदु के साथ किसी समस्या को संदर्भित करता है, एक लोड संतुलित रिमोट होस्ट मेरी स्थिति में समझ में आता है। यह पता लगाने के लिए कि मैंने केवल तब तक ब्लॉक करने का फैसला किया जब तक कि मैं वैध, गैर-झूठी कर्ल प्रतिक्रिया प्राप्त नहीं कर सकता और वहां से जाऊं। सबसे अच्छा मैं अब के लिए मिला है। – mquinn

+3

मुझे नहीं लगता कि मैक के पास नेटवर्क मैक पते के साथ कुछ भी करना है। यह संदेश प्रमाणीकरण कोड के लिए खड़ा है: http://en.wikipedia.org/wiki/Message_authentication_code ... यह मेरे निष्कर्ष है कि "दूरस्थ होस्ट मैक पते" बदलते इस समस्या को और उपाध्यक्ष प्रतिकूल के साथ कोई संबंध नहीं है की ओर जाता है। –

+0

@ चार्ल्स ओलिवर नटर अच्छा पकड़, लेकिन यह अभी भी कुछ ऐसी समस्या हो सकती है जिसे होस्ट (एसएसएल कैश?) के बीच साझा किया जाना चाहिए और जो नहीं है। – regilero

1

आप इस विकल्प की आवश्यकता हो सकती:

CURLOPT_FORBID_REUSE

एक लंबे दर्रा। अगले स्थानांतरण को पूरा करने के लिए कनेक्शन को बंद करने के लिए 1 पर सेट करें। आम तौर पर, libcurl एक हस्तांतरण के साथ किए जाने पर सभी कनेक्शनों को जीवित रखता है यदि एक सफल व्यक्ति निम्न का उपयोग कर सकता है। इस विकल्प का सावधानी से उपयोग किया जाना चाहिए और केवल तभी जब आप समझें कि यह क्या करता है। Libcurl को बाद में पुनः उपयोग (डिफ़ॉल्ट व्यवहार) के लिए कनेक्शन खोलने के लिए 0 पर सेट करें।

+0

सुझाव के लिए धन्यवाद लेकिन इसका कोई फायदा नहीं हुआ। मैंने पहले CURLOPT_FRESH_CONNECT की कोशिश की थी लेकिन यह काम नहीं किया था, और FORBID_REUSE के परिणामस्वरूप वही पुराना व्यवहार हुआ। – mquinn

0

क्या आपने कोशिश की थी? curl_setopt ($ हैंडल, CURLOPT_SSLVERSION, 3);