PHPでは、file_get_contenst()関数にURLを指定する事で、他のサイトのhtmlテキストを取得できます。
1つのサイトだけを取得する場合はこれでよいのですが、大量のサイトからデータを取得する場合、
1サイトつづ順番に関数を呼んでいたら非常に時間が掛かります。
このような場合はcURLモジュールに有るcurl_multi_getcontent()関数を使用すると、複数サイトの情報を非同期で同時に取得出来ます。
ですが、curl_multi_getcontent()は、リソースの確保・開放処理が必要で、扱いがちょっと煩雑です。
この為、今回はfile_get_contenst()と同じくらい簡単に使用できるラッパ関数を作成しました。
名前は分かりやすくmulti_file_get_contenst()としました。
呼び側のコードはこんな感じになります。
<?php $urlList = array(); $urlList[] = "http://www.yahoo.co.jp/"; $urlList[] = "http://www.google.com/"; $urlList[] = "http://www.infoseek.co.jp/"; $urlList[] = "http://www.goo.ne.jp/"; //----------------------------------------- // 複数URLのデータを非同期で同時に取得する //----------------------------------------- $htmlTextList = multi_file_get_contents( $urlList ); //----------------------------------------- // 取得結果の使用(データ長をデバッグ出力) //----------------------------------------- foreach( $htmlTextList as $htmlText ) { echo "text length: " . strlen( $htmlText ) . "<br />"; } |
実行結果

で、実際の関数は以下の通りです。
<?php function multi_file_get_contents( $urlList ) { $resList = array(); // 接続情報の一覧 //------------------------------------ // cUrlのハンドルを取得 //------------------------------------ $handle = curl_multi_init(); //------------------------------------ // 接続毎のリソース情報を一覧に追加 //------------------------------------ foreach ( $urlList as $url ) { $res= curl_init( $url ); // CURLOPT_RETURNTRANSFER=true // -> curl_multi_getcontent()の返り値で結果を受け取る curl_setopt( $res, CURLOPT_RETURNTRANSFER, TRUE ); curl_multi_add_handle($handle, $res ); $resList[] = $res; } //---------------------------------- // 非同期でデータを取得する // (全データを取り終わるまで待つ) //---------------------------------- do { curl_multi_exec( $handle, $isRunning ); } while ( $isRunning ); //---------------------------- // 取得した結果を配列に格納 //---------------------------- $htmlTextList = array(); foreach ( $resList as $res ) { $htmlTextList[] = curl_multi_getcontent( $res ); } // リソースの破棄 foreach ( $resList as $res ) { curl_multi_remove_handle($handle, $res ); curl_close( $res ); } curl_multi_close( $handle ); // 取得結果を返す return $htmlTextList; } |
PHPの実行環境によっては、関数内にあるcurl_multi_init()でエラーが出る場合が有ります。

Fatal error: Call to undefined function curl_multi_init() |
このような場合はphp.iniを編集し、php_curl.dllのextensionを有効にして下さい
編集前
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; ;extension=php_curl.dll |
↓
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; extension=php_curl.dll |
関連記事
コメントを残す