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 使用率が改善されるとは思えません。
ただし、カールが完了するのを待っている間にスリープすると、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 に答える