我应该关闭cURL吗?

mak*_*oiz 18 php performance curl

我有一个函数,使用cURL多次调用3个不同的API .每个API的结果都会传递给嵌套循环中调用的下一个API,因此cURL当前打开并关闭了500多次.

我是否应该为整个功能打开cURL,或者可以在一个功能中多次打开和关闭它?

All*_*ice 25

重用相同的句柄会有性能提升.请参阅:重复使用相同的卷曲手柄.性能大幅增加?

如果您不需要同步请求,请考虑使用curl_multi_*函数(例如curl_multi_init,curl_multi_exec等),这也提供了很大的性能提升.

更新:

我尝试使用每个请求的新句柄并使用与以下代码相同的句柄来进行卷曲:

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>';
Run Code Online (Sandbox Code Playgroud)

并得到以下结果:

Curl without handle reuse: 8.5690529346466
Curl with handle reuse: 5.3703031539917
Run Code Online (Sandbox Code Playgroud)

因此,重复使用相同的句柄实际上会在多次连接到同一服务器时提供显着的性能提升.我尝试连接到不同的服务器:

$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>';
Run Code Online (Sandbox Code Playgroud)

得到以下结果:

Curl without handle reuse: 3.7672290802002
Curl with handle reuse: 3.0146431922913
Run Code Online (Sandbox Code Playgroud)

性能仍有相当大的提升.