サイトアイコン IT NEWS

PHPのcURLをcurl_multiで複数同時に実行する方法

php-curl_multi

突然ですが、PHPcURL関数はご存知でしょうか?
たぶん皆さんは、何度か耳にしたことがある、またはAPIを叩く場合などに使用しているのではないだろうか。
著者もたまに利用していますが、複数API同時に叩く際は1つずつループしていた。
今回は、curl_multiを使った複数同時接続レスポンスを改善した時のお話です。

cURLを同時に実行する

と言っても、基本的な流れはcURLとほぼ変わりません。
URLオプションcurl_multi_add_handle()で追加して、curl_multi_exec()で同時実行し、curl_multi_remove_handle()で消していくといった流れです。
つまり、追加と削除はループして行い、実行は一発行うと言った感じです。

curl_multi用の関数を作ると便利!

以下、配列に格納した複数URLを渡すと、それぞれの結果がURLをキーにした配列で返って来るという関数を作ってみました。

function getMultiContents($urls)
{
    $mh = curl_multi_init();
    $chs = [];
    $ret = [];
    foreach($urls as $url) {
        $chs[$url] = curl_init($url);
        curl_setopt($chs[$url], CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($chs[$url], CURLOPT_TIMEOUT, 60);
        curl_multi_add_handle($mh, $chs[$url]);
    }
    $running = null;
    do { curl_multi_exec($mh, $running); } while ( $running );
    foreach( $urls as $url ) {
        // $ret[] = curl_getinfo($chs[$url]);
        $ret[$url] = curl_multi_getcontent($chs[$url]);
        curl_multi_remove_handle($mh, $chs[$url]);
        curl_close($chs[$url]);
    }
    curl_multi_close($mh);
    return $ret;
}

関数の使い方

URLの配列を作り、先程作成した関数の引数に渡し、返って来た結果を表示します。

$urls = [
    '?id=1',
    '?id=2',
    '?id=3',
];
$ret = getMultiContents($urls);
foreach ($ret as $url => $value) {
    echo $value.'<br>';
}

たぶん、APIの戻り値ならJSON形式だと思うので、任意でjson_decode()とかしてあげてください。
以下、参考です。

以上、ありがとうございました。

モバイルバージョンを終了