0

我在 php 中有一个使用多卷曲的脚本。

一般的多卷曲请求由 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;
4

2 回答 2

2

如果您没有将 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 );
于 2012-05-10T11:54:36.103 回答
0

这已经在stackoverflow上回答了很多次。你必须使用curl_multi_select来避免忙循环。

于 2012-05-10T17:33:17.893 回答