重复使用相同的卷曲手柄.性能大幅增加?

ben*_*ail 27 php performance curl

在php脚本中,我正在为不同的URL做很多不同的cUrl GET请求(一百个).

从curl_init重用相同的curl句柄会改善性能还是与cURL请求的响应时间相比可忽略不计?

我问的是,因为在当前的架构中,保持相同的cUrl句柄并不容易.

谢谢,

本杰明

All*_*ice 44

从Crossposted 我应该关闭卷曲或不?因为我认为这也很重要.

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

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)

并得到以下结果:

没有句柄重用的
卷曲:8.5690529346466 卷柄与句柄重用: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>';
Run Code Online (Sandbox Code Playgroud)

得到以下结果:

没有句柄重用的
卷曲:3.7672290802002 卷柄与句柄重用:3.0146431922913

性能仍有相当大的提升.


Ant*_*ult 16

这取决于网址是否在同一台服务器上.如果是,则对同一服务器的并发请求将重用该连接.请参阅CURLOPT_FORBID_REUSE.

如果URL有时位于同一服务器上,则需要对URL进行排序,因为默认连接缓存限制为十个或二十个连接.

如果它们位于不同的服务器上,则使用相同的句柄没有速度优势.

使用curl_multi_exec,您可以同时连接到不同的服务器(并行).即使这样,你也需要一些排队才能使用数千个同时连接.

  • 这个答案含糊不清.它没有明确回答用户的问题 - 重复使用相同的卷曲处理...提高性能?声明"如果是,对同一服务器的并发请求将重用连接".< - 这个短语可以假设使用相同的卷曲手柄,或者不使用相同的卷曲.如果不是,则更好地明确声明"如果它们是,对同一服务器的并发请求将重用连接,无论是否重用相同的卷曲句柄" (2认同)
  • 第一句话的更准确的改进应该是:“这取决于网址是否位于同一服务器上。如果是,对同一服务器的并发请求将重用该连接,**如果重用相同的curl句柄**。请参阅 CURLOPT_FORBID_REUSE。` (2认同)

ame*_*hes 7

我有一个类似的情况,我将数据发布到服务器.它被分成大约100行的请求,因此它产生了很多请求.在基准测试中,我比较了12.614行的两种方法(需要127个请求)加上认证和另一个内务处理请求(总共129个请求).

请求通过网络传输到同一国家/地区的服务器,而不是现场.它们受到TLS 1.2的保护(握手也会造成损失,但鉴于HTTPS越来越成为默认选择,这甚至可能使它与您的场景更相似).

的卷曲复用: 一个$curlHandlecurl_init()"编一次,然后只具有修饰的CURLOPT_URLCURLOPT_POSTFIELDS

Run  1: ~42.92s
Run  3: ~41.52s
Run  4: ~53.17s
Run  5: ~53.93s
Run  6: ~55.51s
Run 11: ~53.59s
Run 12: ~53.76s
Avg: 50,63s / Std.Dev: 5,8s
TCP-Conversations / SSL Handshakes: 5 (Wireshark)
Run Code Online (Sandbox Code Playgroud)

没有cURL重用:curl_init每个请求 一个

Run  2: ~57.67s
Run  7: ~62.13s
Run  8: ~71.59s
Run  9: ~70.70s
Run 10: ~59.12s
Avg: 64,24s / Std. Dev: 6,5s
TCP-Conversations / SSL Handshakes: 129 (Wireshark)
Run Code Online (Sandbox Code Playgroud)

它不是最大的数据集,但可以说所有"重用"运行都比所有"init"运行都快.平均时间差异大约为14秒.