2013-08-04 5 views
15

मेरे पास एक ऐसा फ़ंक्शन है जो curl एकाधिक बार उपयोग करके 3 अलग-अलग एपीआई कॉल करता है। प्रत्येक एपीआई का परिणाम अगली एपीआई को नेस्टेड लूप में बुलाया जाता है, इसलिए वर्तमान में कर्ल 500 गुना खोला जाता है और बंद हो जाता है।क्या मुझे कर्ल बंद करना चाहिए या नहीं?

क्या मुझे पूरे फ़ंक्शन के लिए कर्ल खोलना चाहिए या क्या इसे एक समारोह में कई बार खोलना और बंद करना ठीक है?

+3

उपयोग को देखे बिना और अस्पष्ट तरीके से कैसे संभाला जा रहा है, बिना सुंदर अस्पष्ट प्रश्न। –

+1

मैं विश्वसनीयता पक्ष पर गलती करता हूं, और ताजा हैंडल कम समस्याग्रस्त प्रतीत होते हैं क्योंकि अनुरोध से बचे हुए राज्य भविष्य में अनुरोधों को प्रदूषित करने की संभावना कम लगता है यदि आप ताजा हैंडल करते हैं। इसके साथ ही, मेरे पास एक प्रक्रिया है जो नियमित रूप से सप्ताहों तक चलती है, उसी कर्ल हैंडल पर लगभग दस लाख http अनुरोध करता है। वे एक ही डोमेन पर एक एपीआई के लिए बहुत ही सरल http अनुरोध हैं। मुझे कोई समस्या नहीं मिली है। – goat

+0

संभावित डुप्लिकेट [जब curls फ़ंक्शन कर्ल \ _close का उपयोग कब करें?] (Http://stackoverflow.com/questions/3849857/when-to-use-curls-function-curl-close) –

उत्तर

20

एक ही हैंडल का पुन: उपयोग करने के लिए प्रदर्शन में वृद्धि हुई है। देखें: Reusing the same curl handle. Big performance increase?

आप अनुरोधों की जरूरत नहीं है तुल्यकालिक होने के लिए, curl_multi_ का उपयोग कर * कार्यों पर विचार (जैसे curl_multi_init, curl_multi_exec, आदि) जो भी एक बड़ा प्रदर्शन को बढ़ावा देने प्रदान करते हैं।

अद्यतन:

मैं प्रत्येक अनुरोध के लिए एक नया हैंडल का उपयोग करता है और निम्नलिखित कोड के साथ एक ही हैंडल का उपयोग के साथ कर्ल benching की कोशिश की:

Curl without handle reuse: 8.5690529346466 
Curl with handle reuse: 5.3703031539917 
:

ob_start(); //Trying to avoid setting as many curl options as possible 
$start_time = microtime(true); 
for ($i = 0; $i < 100; ++$i) { 
    $rand = rand(); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand); 
    curl_exec($ch); 
    curl_close($ch); 
} 
$end_time = microtime(true); 
ob_end_clean(); 
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>'; 

ob_start(); //Trying to avoid setting as many curl options as possible 
$start_time = microtime(true); 
$ch = curl_init(); 
for ($i = 0; $i < 100; ++$i) { 
    $rand = rand(); 
    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/?rand=" . $rand); 
    curl_exec($ch); 
} 
curl_close($ch); 
$end_time = microtime(true); 
ob_end_clean(); 
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>'; 

और निम्न परिणाम मिला

तो उसी सर्वर से कनेक्ट होने पर एक ही हैंडल का पुन: उपयोग करना वास्तव में एक महत्वपूर्ण प्रदर्शन वृद्धि प्रदान करता है। मैं अलग सर्वर से कनेक्ट करने की कोशिश की:

$url_arr = array(
    'http://www.google.com/', 
    'http://www.bing.com/', 
    'http://www.yahoo.com/', 
    'http://www.slashdot.org/', 
    'http://www.stackoverflow.com/', 
    'http://github.com/', 
    'http://www.harvard.edu/', 
    'http://www.gamefaqs.com/', 
    'http://www.mangaupdates.com/', 
    'http://www.cnn.com/' 
); 
ob_start(); //Trying to avoid setting as many curl options as possible 
$start_time = microtime(true); 
foreach ($url_arr as $url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_exec($ch); 
    curl_close($ch); 
} 
$end_time = microtime(true); 
ob_end_clean(); 
echo 'Curl without handle reuse: ' . ($end_time - $start_time) . '<br>'; 

ob_start(); //Trying to avoid setting as many curl options as possible 
$start_time = microtime(true); 
$ch = curl_init(); 
foreach ($url_arr as $url) { 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_exec($ch); 
} 
curl_close($ch); 
$end_time = microtime(true); 
ob_end_clean(); 
echo 'Curl with handle reuse: ' . ($end_time - $start_time) . '<br>'; 

और निम्न परिणाम मिला:

Curl without handle reuse: 3.7672290802002 
Curl with handle reuse: 3.0146431922913 

फिर भी काफी पर्याप्त प्रदर्शन वृद्धि हुई है।

+0

मुझे आश्चर्य है कि कर्ल का उपयोग कर रहा है या नहीं -अलिव कनेक्शन वह अकेले प्रदर्शन को बढ़ावा देने के लिए जिम्मेदार हो सकता है। – goat

+0

मेरा मानना ​​है कि curl जीवित रहने का उपयोग करता है, लेकिन curl_exec() के लिए प्रत्येक कॉल एक नया अनुरोध शुरू करता है (क्योंकि विकल्प बदल सकते हैं, आदि) खासकर जब किसी भिन्न सर्वर से कनेक्ट करते हैं, तो यह मामला होना होगा। – AlliterativeAlice

+0

सभी को धन्यवाद। जबकि मैं एक ही सर्वर से कनेक्ट कर रहा हूं लेकिन अलग-अलग यूआरएल, मैं ओटम पोस्ट किए गए बेंचमार्क से आश्चर्यचकित हूं। हालांकि मुझे वास्तव में विश्वसनीयता बिंदु पसंद है कि क्रिस ने पोस्ट किया ..... – makenoiz

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

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