2009-06-09 11 views
52

मैं HTTP के माध्यम से एक एसओएलआर इंडेक्स में दस्तावेज़ जोड़ने के लिए एक साधारण PHP लाइब्रेरी का उपयोग कर रहा हूं।PHP कर्ल लाइब्रेरी के साथ लगातार/रखरखाव HTTP?

3 सर्वर शामिल है, वर्तमान में कर रहे हैं:

  1. पीएचपी बॉक्स अनुक्रमण काम
  2. एक डेटाबेस बॉक्स डेटा पकड़े
  3. Solr बॉक्स अनुक्रमणिका में शामिल होने चल रहा है।

80 दस्तावेजों पर/सेक (1 मिलियन डॉक्स से बाहर), मैं PHP और Solr बक्से पर नेटवर्क इंटरफेस पर एक असामान्य रूप से उच्च बाधा दर (2000/सेक देख रहा हूँ, क्या अधिक है, रेखांकन लगभग हैं समान - जब PHP बॉक्स स्पाइक्स पर बाधा दर, यह सोलर बॉक्स पर भी स्पाइक्स), लेकिन डेटाबेस बॉक्स (300/सेकंड) पर बहुत कम है। मुझे लगता है कि यह बस इसलिए है क्योंकि मैं डेटाबेस सर्वर से एक कनेक्शन खोलता हूं और पुन: उपयोग करता हूं, लेकिन प्रत्येक एकल सोलर अनुरोध वर्तमान में कर्ल के माध्यम से एक नया HTTP कनेक्शन खोल रहा है, जिस तरह से सौर क्लाइंट लाइब्रेरी लिखी गई है।

तो, मेरे सवाल यह है:

  1. कर्ल एक keepalive सत्र खोलने के लिए बनाया जा सकता है?
  2. कनेक्शन का पुन: उपयोग करने में क्या लगता है? - क्या यह कर्ल हैंडल संसाधन का पुन: उपयोग करने के समान सरल है?
  3. क्या मुझे कोई विशेष कर्ल विकल्प सेट करने की आवश्यकता है? (उदाहरण के लिए बल HTTP 1.1?)
  4. क्या कर्ल रखरखाव कनेक्शन के साथ कोई गठिया है? यह स्क्रिप्ट एक समय में घंटों तक चलता है; क्या मैं एक कनेक्शन का उपयोग करने में सक्षम हूं, या मुझे आवधिक रूप से फिर से कनेक्ट करने की आवश्यकता होगी?
+3

खैर मैं का उपयोग किया है डी जहां हम कई सारे पृष्ठों के साथ एक पूरी साइट को पार्स कर रहे थे जिसके लिए प्रमाणीकरण की आवश्यकता थी और पूरे सत्र में बनाए रखा गया था। इनियल हैंडल संसाधन का उपयोग करके आप पेज प्राप्त करने और क्लाइंट के साथ समान सत्र और कनेक्शन बनाए रखने के लिए आदेश निष्पादित करना जारी रख सकते हैं। कमांड लाइन का उपयोग करना यह लगभग 20 मिनट तक चला गया है (हमारी सभी डेटा आवश्यकताओं के लिए - इसलिए लंबे समय तक टिक सकता है) बिना दोबारा जुड़ने की आवश्यकता के। लेकिन मुझे यकीन नहीं है कि अगर आप यही पूछ रहे हैं तो यह एक टिप्पणी है और जवाब नहीं है :) –

+0

एक और नोट, अक्सर ऐसे विकल्प होते हैं जिन्हें आप जो कर रहे हैं उसके आधार पर सेट करने की आवश्यकता होगी और जिस सर्वर पर आप हैं को जोड़ रहा। यह सब यहां अच्छी तरह से प्रलेखित है: http://uk3.php.net/manual/en/function.curl-setopt.php –

+3

अक्सर पूछे जाने वाले प्रश्नों का यह हिस्सा प्रासंगिक है, हालांकि बहुत विस्तृत नहीं है: http: //curl.haxx .se/docs/faq.html # Can_I_perform_multiple_requests –

उत्तर

49

cURL पीएचपी प्रलेखन (curl_setopt) का कहना है:

CURLOPT_FORBID_REUSE - TRUE मजबूर करने के लिए कनेक्शन को स्पष्ट रूप से करीब जब यह संसाधन समाप्त होने के, और पुनः उपयोग के लिए जमा नहीं किया जा।

तो:

  1. डिफ़ॉल्ट रूप से हाँ, वास्तव में यह करना चाहिए फिर से उपयोग कनेक्शन है, जब तक आप के रूप में फिर से उपयोग cURL संभाल।
  2. डिफ़ॉल्ट रूप से, curl अपने आप से लगातार कनेक्शन संभालता है; आपको कुछ विशेष शीर्षकों की आवश्यकता होनी चाहिए, CURLOPT_HTTPHEADER
  3. सर्वर एक रख-रखाव टाइमआउट भेज सकता है (डिफ़ॉल्ट अपाचे इंस्टॉल के साथ, यह 15 सेकंड या 100 अनुरोध है, जो भी पहले आता है) - लेकिन जब ऐसा होता है तो कर्ल बस एक और कनेक्शन खोल देगा ।
+1

शानदार! मैं अपना पहला स्टैक ओवरफ्लो प्रश्न पोस्ट करने के करीब था। यह समाधान हमारे मिडलवेयर के लिए काम करता है बशर्ते हमने अनुरोध हेडर 'कनेक्शन: क्लोज' जोड़ा। – renevanderark

1

यदि आपको अनुरोध से प्रतिक्रिया की परवाह नहीं है, तो आप उन्हें असीमित रूप से कर सकते हैं, लेकिन आप अपने एसओएलआर इंडेक्स को अधिभारित करने का जोखिम चलाते हैं। मुझे संदेह है कि हालांकि, एसओएलआर बहुत तेज है।

Asynchronous PHP calls?

+0

यह निश्चित रूप से दिलचस्प है, लेकिन यह कनेक्शन पुन: उपयोग को बिल्कुल संबोधित नहीं करता है। असल में, यह केवल मेरे कनेक्शन ओवरहेड मुद्दों को और खराब कर देगा। –

13
  1. सर्वर आप जीवित-रखें एक्सेस कर रहे हैं पर सक्षम होने चाहिए और अधिकतम रखें जिंदा अनुरोध उचित होना चाहिए।अपाचे के मामले में, apache docs देखें।

  2. आपको उसी कर्ल संदर्भ का पुनः उपयोग करना होगा।

  3. जब cURL संदर्भ को विन्यस्त, जीवित-रखें शीर्ष लेख में टाइमआउट के साथ सक्षम:

    curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array(
        'Connection: Keep-Alive', 
        'Keep-Alive: 300' 
    )); 
    
+0

मुझे आश्चर्य है कि क्या कर्ल डिफ़ॉल्ट रूप से एक Keep-Alive शीर्षलेख भेजता है ... –

+2

फ्रैंक, मैंने अभी अपना कोड दोबारा परीक्षण किया है और यह डिफ़ॉल्ट रूप से चालू दिखता है। हालांकि इसे स्पष्ट रूप से सेट करने के लिए चोट नहीं पहुंची। –

+1

@ ओलेग बरशा क्या आपको पता है कि हमें जीवित रहने के लिए 'curl_close ($ curlHandle) को हटाने की आवश्यकता है। ? – zeflex

19

कर्ल डिफ़ॉल्ट रूप से रखें जिंदा हेडर भेजता है, लेकिन:

  1. बनाने किसी भी पैरामीटर के बिना curl_init() का उपयोग कर एक संदर्भ।
  2. दुकान एक दायरे में संदर्भ में, जहां यह बच जाएगा (एक स्थानीय वर नहीं)
  3. उपयोग CURLOPT_URL विकल्प का उपयोग curl_exec()
  4. के सिलसिले को बंद नहीं करते अनुरोध संदर्भ
  5. को यूआरएल पारित करने के लिए निष्पादित curl_close()

बहुत ही बुनियादी उदाहरण:

function get($url) { 
    global $context; 
    curl_setopt($context, CURLOPT_URL, $url); 
    return curl_exec($context); 
} 

$context = curl_init(); 
//multiple calls to get() here 
curl_close($context); 
+0

आपको दूसरी कॉल से पहले कुकी सेट करने की भी आवश्यकता है, जैसे: curl_setopt ($ context, CURLOPT_COOKIE,' name = value ') ; 'उदाहरण के लिए मेरे अनुरोध के लिए curl_setopt ($ संदर्भ, CURLOPT_COOKIE,' PHPSESSID = bl392rgi8q664l7faat33hfta4 ') है; ' –

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