多 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) 的最新正确用法?的主要内容,如果未能解决你的问题,请参考以下文章