【问题标题】:Count how many curl_multi requests have been made计算发出了多少 curl_multi 请求
【发布时间】:2020-05-20 18:32:23
【问题描述】:

我想知道使用 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 复制代码。

我的命中测试出奇地不一致。它似乎只在某些时候起作用。也许当我提出少量请求时。所以问题实际上可能与终点有关。如果是这种情况,我如何跟踪端点是否拒绝了我的请求?

【问题讨论】:

  • 你看到了吗:technosophos.com/2012/10/26/php-and-curlmultiexec.html。我通常使用库来处理它。例如:github.com/MartinMajor/async-request
  • 您没有从 $mh 中删除已完成的句柄,这可能与您的不一致问题有关。if ($info !== false) {curl_multi_remove_handle($mh,$info['handle']);
  • ick,你也可能会丢失消息,如果多个句柄在同一个 exec() 中完成,那么你只读取第一个句柄的消息,其余句柄的消息将丢失!糟糕的错误,while(false!==($info=curl_multi_info_read($mh))){curl_multi_remove_handle($mh,$info['handle']); $i++; if ($i % 10 === 0 && $i>0) logTimeElapsed(); }

标签: php rest curl parallel-processing curl-multi


【解决方案1】:

我的命中测试出奇地不一致

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

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

$running 为 2,完成后 $running 为 0,则

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

只会读取第一条消息,来自第二个句柄的消息将被永远忽略!您需要阅读所有消息,无论是 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 的作业/cpu 也会减少,因为它有一个较小的迭代列表

同样作为一个小的优化,你应该 curl_multi_select() 在阅读消息之后,而不是在阅读之前,然后你的 cpu 将在等待网络活动时忙于处理消息,而不是在有网络活动之前休眠,然后阅读前一个 exec() 的消息,简单地说,如果你只是将 select() 放在 info_read() 之后,而不是之前,代码应该会更快。

【讨论】:

  • 谢谢!我现在可以可靠地发送 curl 请求并跟踪它们何时成功。看起来我有一个单独的错误,与只能发送 5 个左右有关,否则它们都会返回 503 错误。可能与端点相关,或与 php 相关。我将在找到的几个问题中创建一个单独的问题并将其链接到此处。感谢您一直以来的帮助! :)
猜你喜欢
  • 2021-12-12
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多