Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reusing the same curl handle. Big performance increase?

In a PHP script I am doing a lot of different curl GET requests (a hundred) to different URLs.

Will reusing the same handle from curl_init improve the performance, or is it negligible compare to the response time of the requests?

I am asking that because in the current architecture it would be not easy to keep the same handle.

like image 279
benjisail Avatar asked Sep 24 '10 12:09

benjisail


1 Answers

Crossposted from Should I close cURL or not? because I think it's relevant here too.

I tried benching curl with using a new handle for each request and using the same handle with the following code:

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>'; 

and got the following results:

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

So reusing the same handle actually provides a substantial performance increase when connecting to the same server multiple times. I tried connecting to different servers:

$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>'; 

And got the following result:

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

Still quite a substantial performance increase.

like image 142
AlliterativeAlice Avatar answered Oct 11 '22 13:10

AlliterativeAlice