我在php中有一个使用多卷曲的脚本。
一般的multiurl请求包含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;
答案 0 :(得分:2)
如果未将CURLOPT_RETURNTRANSFER设置为true并将CURLOPT_NOBODY设置为true,则只会获得布尔值作为结果,无论它是否失败。但我怀疑这会改善CPU使用率 等待卷曲完成时睡觉会改善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 );
答案 1 :(得分:0)
已经在stackoverflow上多次回答过这个问题。您必须使用curl_multi_select来避免繁忙循环。