【PHP】外部サイトからのデータ取得を高速化する「curl_multi」

  • このエントリーをはてなブックマークに追加

外部のAPIと通信する際にちまちまとループしていると、すべての検索結果を取得するまでに結構な時間がかかってしまいます。

せっかくWeb系のAPIを利用しているのに、これではアナログな手段で調べたほうが早くなってしまうというもの…

さらに非同期通信であることが多いわけですから、なんのための非同期通信なのかな?となってしまいます。

そんな場合に「まとめてレスポンスを取得する」ための手段が「curl_multi」関数です。

ということで、自分用にメモとしてまとめておきます。

概要というか流れというか

まず単体の通信設定?を「ハンドル」と呼ぶそうです。

これをまとめたものが「マルチハンドル」というものになります。

と言われてもよくわからないと思いますので、ざっくりとまとめていきます。

ぶっちゃけ以下のコードを応用すれば目的は達成できます(笑)

function getMultiContents( $url_list ) {
    // マルチハンドルの用意
    $mh = curl_multi_init();

    // URLをキーとして、複数のCurlハンドルを入れて保持する配列
    $ch_list = array();

    // Curlハンドルの用意と、マルチハンドルへの登録
    foreach( $url_list as $url ) {
        $ch_list[$url] = curl_init($url);
        curl_setopt($ch_list[$url], CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch_list[$url], CURLOPT_TIMEOUT, 1);  // タイムアウト秒数を指定
        curl_multi_add_handle($mh, $ch_list[$url]);
    }

    // 一括で通信実行、全て終わるのを待つ
    $running = null;
    do { curl_multi_exec($mh, $running); } while ( $running );

    // 実行結果の取得
    foreach( $url_list as $url ) {
        // ステータスとコンテンツ内容の取得
        $results[$url] = curl_getinfo($ch_list[$url]);
        $results[$url]["content"] = curl_multi_getcontent($ch_list[$url]);

        // Curlハンドルの後始末
        curl_multi_remove_handle($mh, $ch_list[$url]);
        curl_close($ch_list[$url]);
    }

    // マルチハンドルの後始末
    curl_multi_close($mh);

    // 結果返却
    return $results;
}

こちらのコードは以下のURLより引用となります。

https://techblog.yahoo.co.jp/architecture/api1_curl_multi/

コード内のコメントで解説はほぼほぼ完了していますので、補足も特にありませんが…

処理速度の向上が体感できるレベルで変わってきますので、ぜひ使ってみてはいかがでしょうか。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*