2012-04-13 18 views
4

以下のコードを実行すると、curl_multi_selectcurl_multi_info_readが矛盾しているようです。私が理解しているように、curl_multi_execに応答がありますが、実際には起こっていないことがわかるまで、curl_multi_selectはブロックされています。なぜcurl_multi_selectとcurl_multi_info_readが矛盾していますか?

$url = "http://google.com"; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_VERBOSE, TRUE); 

$mc = curl_multi_init(); 
curl_multi_add_handle($mc, $ch); 

do { 
    $exec = curl_multi_exec($mc, $running); 
} while ($exec == CURLM_CALL_MULTI_PERFORM); 

$ready=curl_multi_select($mc, 100); 
var_dump($ready); 

$info = curl_multi_info_read($mc,$msgs); 
var_dump($info); 

これは自分自身と矛盾するようだ

int 1 
boolean false 

を返します。どのように準備ができて、何のメッセージも持てませんか?

私が使用しているPHPのバージョンがspecから5.3.9

答えて

5

curl_multi_execと読むべきことがあるまで、基本的にはcurl_multi_selectブロック。 curl_multi_selectを使用せずにcurl_multi_execをループすると、CPUの100%を消費します。 したがって、curl_multi_info_readは、転送が終了したかどうか(正しくまたはエラーあり)を確認するために使用されます。次のパターンに従うべきであるマルチハンドルを使用して

コード:

do 
{ 
    $mrc = curl_multi_exec($this->mh, $active); 
} 
while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) 
{ 
    curl_multi_select($this->mh); 
    do 
    { 
     $mrc = curl_multi_exec($this->mh, $active); 
    } 
    while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    while ($info = curl_multi_info_read($this->mh)) 
    { 
     $this->process_ch($info); 
    } 
} 

も参照してください:Doing curl_multi_exec the right way

+0

奇妙な。私は単純に 'curl_multi_exec()'を短く 'usleep() 'していました。このアプローチに変更すると、すべてのURLを取得するのにかかる時間の合計が2倍になり、失敗したリクエストの数は3倍になり、CPU使用率は基本的に同じままでした。 –

0

です:

個々の転送からのメッセージや情報がある場合、マルチハンドルを確認して下さい。メッセージには、転送のエラーコードや転送が完了したという情報などの情報が含まれている場合があります。

1はアクティビティがあるとは限りませんが、必ずしもメッセージが待機している必要はありません。この場合、ダウンロードデータの一部が利用可能ですが、すべてではありません。 curl_multi_select文書の例では、curl_multi_info_readからのfalse値が明示的にテストされています。

+0

これが真実なら、それはさらに混乱します。 'curl_multi_select'を呼び出すのはどうしてですか?あなたは 'curl_multi_info_read'をループしませんか? – hadees

+0

'curl_multi_info_read'の代わりに、' curl_multi_select'の方がはるかに効率的なループです。 – Femi

+1

応答があるまで実際にブロックしない場合はありません。私はもっ​​と電話しなければならない。あなたがリンクした例は、私が 'curl_multi_select'をコメントアウトするまで私のために働いていませんでした。どちらの場合でも完璧に動作しました。率直に言っても意味がないので、curl_multi_selectがどのように動作するかについては、まだよく分かっています。ブロックを停止している他のアクティビティは何ですか?それが本当なら、それを見る方法があるはずです。 – hadees

関連する問題