2013-08-04 93 views
15

我有一个函数可以多次使用cURL来调用3个不同的API。每个API的结果都被传递给在嵌套循环中调用的下一个API,因此cURL当前打开并关闭了超过500次。我应该关闭cURL吗?

我应该为整个功能打开cURL还是可以在一个功能中打开和关闭很多次?

+3

非常模糊的问题,而没有看到使用情况以及如何处理代码。 –

+1

我倾向于在可靠性方面犯错,而新手柄看起来问题较少,因为如果您做出新的处理方式,请求中的剩余状态似乎不太可能污染未来的请求。据说,我有一个定期运行数周的过程,在同一个卷曲句柄上创建近百万个http请求。它们对于单个域中的单个API非常普通的http请求。我没有遇到任何问题。 – goat

+0

[什么时候使用cURLs函数curl \ _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_initcurl_multi_exec等),它也提供了很大的性能提升。

UPDATE:

我试着钳工卷曲用一个新的手柄为每个请求,并使用相同的手柄用下面的代码:

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

,并得到了以下结果:

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

因此,重复使用相同的句柄实际上可以在多次连接到同一服务器时显着提高性能。我试图连接到不同的服务器:

$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

我想知道curl是否使用keep活动连接。只有这一点可以解释大部分性能提升。 – goat

+0

我相信cURL使用保持活动状态,但每次调用curl_exec()都会启动一个新的请求(因为选项可能已更改等)。尤其是在连接到其他服务器时,情况必然如此。 – AlliterativeAlice

+0

谢谢大家。当我连接到相同的服务器,但不同的网址时,我对基于Otome发布的基准感到惊讶。不过我真的很喜欢克里斯发布的可靠性点..... – makenoiz

相关问题