多 cURL (curl_multi_select) 的最新正确用法?

Posted

技术标签:

【中文标题】多 cURL (curl_multi_select) 的最新正确用法?【英文标题】:UP-TO-DATE correct usage of multi cURL (curl_multi_select )? 【发布时间】:2020-03-17 04:39:21 【问题描述】:

查看php.net 示例和贡献者代码后,我发现有不同的方法,但是其中一些在测试后不起作用或are deprecated。 通过互联网different articles 建议不同的方法:

do 
    curl_multi_exec($mh,$active); 
  
while ($active > 0);

其他示例/程序员使用“高级”方式:

do 
    $mrc = curl_multi_exec($mh, $active);
 while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) 
    if (curl_multi_select($mh) == -1) 
        usleep(1000);
    
    else 
        do 
            $mrc = curl_multi_exec($mh, $active);
         while ($mrc == CURLM_CALL_MULTI_PERFORM);
    

谁能告诉,curl_multi_exec 的最新和最佳用法是什么? (顺便说一句,就我个人而言,i've found usleep 没有任何表现)

【问题讨论】:

代码到底出了什么问题? 为什么要关心直接使用 cURL 而不是使用像 Guzzle 这样的库? “Guzzle 的优势”是什么意思? IMO,使用抽象此类问题的库总是好的,尤其是在所有这些 cURL 选项方面。但由于我对curl_multi_exec 及其用法了解不多,所以我将其写为评论 @T.Todua 从我在文档中看到的内容来看,它还没有被弃用(但是,如果它确实被弃用了) - 但对于所有功能来说都是一样的,除非有公告计划弃用功能,我会说它仍然很好用:)但我可能是错的:p 【参考方案1】:

usleep() 调用不会“提高性能”。在函数不等待任何东西而是立即返回的情况下,它可以避免繁忙循环。在传输开始的名称解析器阶段,尤其是(一些较旧的)libcurl 版本可能会发生这种情况。 (当 CURL/PHP 不再像以前那样运行时,这种预防措施可能会在未来被移除。)

但是您可以肯定地跳过对CURLM_CALL_MULTI_PERFORM 的检查,因为 libcurl 已经很多年没有返回它了。所以,这将使它只是

$active = 1;
$mrc = CURLM_OK;
while ($active && $mrc == CURLM_OK) 
    if (curl_multi_select($mh) == -1) 
        usleep(1000);
    
    else 
       $mrc = curl_multi_exec($mh, $active);
    

【讨论】:

哇,就连丹尼尔也回答了这个问题……我很荣幸,谢谢;) 我可能只是复制粘贴您提供的代码,没有任何额外的问题.. 只是,我可能会问最后一件事 - 我最后发现,我最初的示例基准代码,没有 usleep它更快......我错了吗? 不,这可能没有错。这种方法的问题在于,只有当状态保持较长时间时,您的程序将在此期间使用 100% 的 CPU。并且现代的 libcurl 版本不会在那里返回 -1 所以它不应该发生在它们身上......

以上是关于多 cURL (curl_multi_select) 的最新正确用法?的主要内容,如果未能解决你的问题,请参考以下文章

php使用curl模拟多线程发送请求

PHP 利用 curl 实现多进程下载文件类

php curl 多线程方法

Curl 请求数据多’1‘

利用curl 模拟多线程

多线程 curl 同时处理多个连接