[英]PHP - multiple curl requests curl_multi speed optimizations
我正在使用 curl_multi 并行处理多个 API 请求。
但是,我注意到完成请求所需的时间有很大的波动。
这与 API 本身的速度有关,还是与我在 curl_multi_select 上设置的超时有关? 现在是0.05。 应该少吗? 我怎么知道这个过程正在尽快完成请求,而不会在检查之间浪费时间来查看它们是否完成?
<?php
// Build the multi-curl handle, adding each curl handle
$handles = array(/* Many curl handles*/);
$mh = curl_multi_init();
foreach($handles as $curl){
curl_multi_add_handle($mh, $curl);
}
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh, 0.05); // Should this value be less than 0.05?
} while ($running > 0);
// Close the handles
foreach($results as $curl){
curl_multi_remove_handle($mh, $curl);
}
curl_multi_close($mh);
?>
当前 php 中curl_multi_select()
的实现不会阻塞并且不尊重超时参数,也许以后会修复它。 您的代码中没有实现正确的等待方式,它必须是 2 个循环,我将发布一些来自我的机器人的测试代码作为示例:
$running = 1;
while ($running)
{
# execute request
if ($a = curl_multi_exec($this->murl, $running)) {
throw BotError::text("curl_multi_exec[$a]: ".curl_multi_strerror($a));
}
# check finished
if (!$running) {
break;
}
# wait for activity
while (!$a)
{
if (($a = curl_multi_select($this->murl, $timeout)) < 0)
{
throw BotError::text(
($a = curl_multi_errno($this->murl))
? "curl_multi_select[$a]: ".curl_multi_strerror($a)
: 'system select failed'
);
}
if (!yield) {# ask for continuation
throw BotError::skip();
}
}
}
在那里您可以放置自定义超时而不是“要求继续”,例如睡眠 200 毫秒。
正在做
$running = null;
for(;;){
curl_multi_exec($mh, $running);
if($running <1){
break;
}
curl_multi_select($mh, 1);
}
应该会更好,那么当什么都没有运行时,您将避免无用的 select() ..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.