[PHP]file_get_contenst()で複数サイトのhtmlを非同期・高速に取得する

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




関連記事

コメントを残す

メールアドレスが公開されることはありません。