如何不从 curl-multi 返回数据并减少 CPU 使用率?

Posted

技术标签:

【中文标题】如何不从 curl-multi 返回数据并减少 CPU 使用率?【英文标题】:How to NOT return data from curl-multi and reduce CPU usage? 【发布时间】:2012-05-10 11:25:32 【问题描述】:

我在 php 中有一个使用多重 curl 的脚本。

一般多卷曲请求由 50 个单独的卷曲句柄组成。每个请求返回都需要一些时间,所以我的脚本应该等到远程服务器上的处理完成。

这 50 个请求中的每一个都返回大量我不需要的数据(内容)。因此,忽略返回的数据会更有效。但是我确实需要知道远程服务器上的处理何时完成,即返回数据的时间。

我不需要使用数据但确实需要发出请求的原因是远程服务器将数据放入数据库中,然后我从自己的服务器中获取。所以我基本上只需要发出这个请求并且我需要知道远程服务器上的脚本何时完成。

我的问题: 这个请求消耗了大量的 CPU,如何提高效率?

代码:

$nrofrequests=count($variable1);

//Build multi-curl for all to scrape sites at once:
for($i=0;$i<$nrofrequests;$i++)

$post='variable1='.$variable1[$i].'&variable2='.$variable2[$i];
$url='http://www.domain.com/'.$scriptnumber[$i];


$ch[$i] = curl_init($url);
curl_setopt ($ch[$i], CURLOPT_POST, 1);     
curl_setopt ($ch[$i], CURLOPT_POSTFIELDS, $post); 
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch[$i], CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch[$i], CURLOPT_TIMEOUT, 35);  
set_time_limit(35); 



// build the multi-curl handle, adding both $ch
$mh = curl_multi_init();
for ($i=0; $i<$nrofrequests; $i ++ ):
curl_multi_add_handle($mh, $ch[$i]);
endfor;


// execute all queries simultaneously, and continue when all are complete
$running = null;
do curl_multi_exec($mh, $running); 
while ($running);


for ($i=0; $i<$nrofrequests; $i ++ ):
curl_multi_remove_handle($mh, $ch[$i]);
endfor;

【问题讨论】:

也许有帮助:curl.haxx.se/mail/lib-2009-02/0166.html。是C语言的,但是PHP的原理应该是一样的。 【参考方案1】:

如果您不将 CURLOPT_RETURNTRANSFER 设置为 true 并将 CURLOPT_NOBODY 设置为 true,则无论是否失败,您都只会得到一个布尔值。但我怀疑这会提高 CPU 使用率。 然而,在等待 curl 完成时休眠会提高 CPU 使用率。

// During init
curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, false); 
curl_setopt($chi[$i], CURLOPT_NOBODY,true);

// execute all queries simultaneously, and continue when all are complete
$running = null;
do 
    curl_multi_select($mh,5);  // Wait max 5 seconds 'till at least one of the curls shows activity
    curl_multi_exec($mh, $running);
 
while ($running );

【讨论】:

这种方式效率极低,我真的不推荐这种方式 @DanielStenberg,为什么?您仍然需要等待所有 curl-request 完成并等待它休眠,所以我真的不明白为什么这是低效的。如果您愿意解释原因,如果确实如此,我将编辑或删除我的答案。 因为它会无条件休眠很长时间,这基本上会使这段代码总是比正确使用 curl_multi_select 方式多花半秒左右 没错,但如果你愿意,你可以降低睡眠值来避免这种情况。 采纳了您的建议。【参考方案2】:

这个问题已经在 *** 上回答过很多次了。您必须使用 curl_multi_select 来避免忙循环。

【讨论】:

以上是关于如何不从 curl-multi 返回数据并减少 CPU 使用率?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不从 DataFrame 转换并访问它的情况下将列添加到 Dataset?

PDO 不从 mysql 查询返回结果

返回本地文本而不从 PHP 脚本解析到 ajax 脚本

AWS Lambda 测试不从 DynamoDB 表返回数据

减少函数中的多个返回

AngularJs $http 请求保持挂起,不从数据库返回值