统计发出了多少 curl_multi 次请求

Count how many curl_multi requests have been made

我想知道在使用 curl_multi 时每个 curl 请求是什么时候发出的。

到目前为止我的代码:

$i = 0;
do {
    $status = curl_multi_exec($mh, $running);
    if($running){
        curl_multi_select($mh);
    }
    $info = curl_multi_info_read($mh);
    if ($info !== false) {
        $i++;
        if ($i % 10 === 0 && $i>0)
            logTimeElapsed();
    }
} while ($running && $status == CURLM_OK);

我主要从 here 复制代码。

我的命中测试非常不一致。它似乎只是有时工作。也许当我提出少量请求时。所以这个问题实际上可能与终点有关。如果是这样,我如何跟踪端点是否拒绝了我的请求?

My tests of hit has been strangly inconsistent

是啊,难怪。如果多个句柄在同一个 exec() 调用中完成,则代码中存在错误,您将只会读取第一个句柄的消息,其余句柄的消息将丢失! (编辑:但这不是你的错,错误来自你在 https://www.php.net/manual/en/function.curl-multi-info-read.php , someone should fix the docs!) (edit2: fixed the docs: https://github.com/php/doc-en/pull/102 的 copypasta)让我们说之前

    $status = curl_multi_exec($mh, $running);

$运行ning为2,完成后$运行ning为0,则

$info = curl_multi_info_read($mh);
if ($info !== false) {
    $i++;
    if ($i % 10 === 0 && $i>0)
        logTimeElapsed();
}

只会读取第一个消息,第2个句柄的消息将永远被忽略!您需要阅读所有消息,无论是 1 条消息还是 100 条消息,为此使用 while()

while(false!==($info=curl_multi_info_read($mh))){

然后将读取所有消息。你也应该从 $mh 中删除完成的句柄,所以添加

while(false!==($info=curl_multi_info_read($mh))){
    curl_multi_remove_handle($mh,$info['handle']);

这样我们可以确保 curl_multi_exec() 不会尝试重新 运行 完成的句柄.. multi_exec 的 job/cpu 也会减少,因为它有一个较小的列表要迭代

另外,作为一个小的优化,您应该在阅读消息之后 curl_multi_select(),而不是在阅读消息之前,这样您的 cpu 将在等待网络时忙于处理消息 activity,而不是休眠直到有网络 activity,然后读取前一个 exec() 的消息,简单地说,如果你把 select() 放在 [=32] 之后,代码应该更快=](),之前没有。