突然ですが、PHPのcURL関数はご存知でしょうか?
たぶん皆さんは、何度か耳にしたことがある、またはAPIを叩く場合などに使用しているのではないだろうか。
著者もたまに利用していますが、複数のcurlを同時に叩く際は1つずつループしていた。
今回は、curl_multiを使った複数同時接続でレスポンスを改善した時のお話です。
目次
curl_multiでcURLを同時に実行する
と言っても、基本的な流れはcURLとほぼ変わりません。
curl_multi実行の流れ
- Step.1curl_multi_add_handle()
cURLしたいURLリストを追加する。
- Step.2curl_multi_exec()
複数を同時(並行して)実行する。
- Step.3curl_multi_remove_handle()
ハンドラを閉じて終了する。
つまり、追加と削除はループして行い、実行は一発で行うと言った感じです。
curl_multi用の関数を作ると便利!
以下、配列に格納した複数のURLを渡すと、それぞれの結果がURLをキーにした配列で返って来るという関数を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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; } |
curl_multi用関数の使い方
URLの配列を作り、先程作成した関数の引数に渡し、返って来た結果を表示します。
1 2 3 4 5 6 7 8 9 |
$urls = [ 'https://www.example.com?id=1', 'https://www.example.com?id=2', 'https://www.example.com?id=3', ]; $ret = getMultiContents($urls); foreach ($ret as $url => $value) { echo $value.'<br>'; } |
たぶん、APIの戻り値ならJSON形式が一般的だと思いますので、任意で[json_decode()]とかしてあげてください。
これだけで、cURLのレスポンスが劇的に改善されました!
PHP: curl_multi_init - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world.
以上、ありがとうございました。
コメント