http://css.dzone.com/articles/retrieving-urls-Parallel-curl
- class Footo_Content_Retrieve_HTTP_CURLParallel
- {
- /**
- * cURL を使用して URL のコレクションを並行して取得します。結果は、
- * URL をキーとして、
- * URL の内容を値として持つ連想配列として返されます。
- *
- * @param array $addresses 取得する URL の配列
- * @return array取得するように要求された各 URL のコンテンツ。
- **/
- public function remember($addresses)
- {
- $multiHandle =curl_multi_init();
- $handles = array();
- $results = array() ;
-
- foreach($addresses as $url)
- {
- $handle =curl_init($url);
- $handles[$url] = $handle;
-
- curl_setopt_array($handle, array(
- CURLOPT_HEADER => false,
- CURLOPT_RETURNTRANSFER => true,
- ));
-
- curl_multi_add_handle($multiHandle, $handle);
- }
-
- // ハンドルを実行します
- $result = CURLM_CALL_MULTI_PERFORM;
- $running = false;
-
- //セットアップして、リクエストを行います。
- while ($result == CURLM_CALL_MULTI_PERFORM)
- {
- $result =curl_multi_exec($multiHandle, $running);
- }
-
- // データがすべてのソケットに到着するまで待機します
- while($running && ($ result == CURLM_OK))
- {
- if (curl_multi_select($multiHandle) > -1)
- {
- $result = CURLM_CALL_MULTI_PERFORM;
-
- // ソケットを処理する必要があります
- while ($result == CURLM_CALL_MULTI_PERFORM)
- {
- $result =curl_multi_exec($multiHandle, $running);
- }
- }
- }
-
- // クリーンアップ
- foreach($handles as $url => $handle)
- {
- $results[$url] =curl_multi_getcontent($handle);
-
- curl_multi_remove_handle($multiHandle, $handle);
- curl_close ($handle);
- }
-
- curl_multi_close($multiHandle);
-
- return $results;
- }
- }
复制發
|