2012-05-06 73 views
2

Windows XP PHP 5.3.5でExample #1 from PHPを実行すると、指定されたタイムアウト時間の間、常にcurl_multi_select()行がブロックされます(空白の場合、1秒間ブロックされます。コンテンツを取得するのにかかる時間に関係なく、5秒間ブロックされます)。私はそれがthis bugに関連していると思われる。curl_multi_selectは常にタイムアウト値をブロックします

質問は次のとおりです。何が最善の回避策ですか?私が思いつくのは、いくつかのサイクルを節約する方法として、curl_multi_select()usleep(x)を取り除くことです。

答えて

2

これは、1秒のブロッキングで暮らすことができる限り役立ちます。

manual page for curl_multi_selectには、少なくとも1つの接続が完了するか、または$timeout秒のいずれか早いほうが起きるまで、このブロッキングについてのコメントがあります。 、以前この変更に

// execute the handles 
$still_running = null; 
$this->full_curl_multi_exec($mh, $still_running); 

// check whether the handles have finished 
do { // "wait for completion"-loop 
     curl_multi_select($mh); // non-busy (!) wait for state change 
     $this->full_curl_multi_exec($mh, $still_running); // get new state 
     while ($info = curl_multi_info_read($mh)) { 
      // process completed request (e.g. curl_multi_getcontent($info['handle'])) 
     } 
} while ($still_running); 

PHP 5.4でテストされたコードは働いていませんでした。

private function full_curl_multi_exec($mh, &$still_running) { 
     do { 
       $rv = curl_multi_exec($mh, $still_running); 
     } while ($rv == CURLM_CALL_MULTI_PERFORM); 
     return $rv; 
} 

を次にハンドルを実行するためにチェックし、あなたのループを変更します。彼らはまたcurl_multi_selectへの呼び出しをラップすべきことであるが、書き込みthis bug in PHP 5.3.18のPHP 5.3.20を実行しているAmazonインスタンスでは、への呼び出しは決して他のものを返さないようにします。-1

これで、n 200個のバッチのバッチを使用して30秒未満で最初の1,300のURL

関連する問題