php の cURL Multi Interface で API の並列実行をしてみた
php で API を複数回叩く処理があって、並列で捌けないかとちょっと調べたら curl 拡張モジュールの cURL Multi インタフェースを使えば良いらしいとのこと。早速使ってみた。
情報源は Yahoo! JAPAN Tech Blog。
最初はリンク先の情報を鵜呑みにして実装したところ、あまり速くならなかったし、CPU 使用率が妙に高い。どうも通信の完了を do-while で polling しているのがマズかったみたい。
下記エントリで curl_multi_select を使えば polling しないで済むコトを知ったので CPU 使用率も下がり速くなって効率的に実装できた。多謝。
http://techblog.ecstudio.jp/tech-tips/php-multi.html
めでたしめでたし。にしても curl 拡張インタフェースって、ほとんど C のコード書いてるみたい。定数も山盛り。
ここまで来たら HTTP Pipelining を使って更なる効率化、と高みを目指したいところだったけど CURLMOPT_* は定数に無いし、 ((CURLMOPT_PIPELINING)) curl_multi_setopt も無いため少なくとも現時点では php では HTTP Pipelining は利用できないと判断して断念。
HTTP リクエストに限られているとはいえ、ふつうのスレッドが無い php で比較的シンプルに並列処理が可能なのは新鮮な驚きだった。意外とできる子なのね。WebAPI 使うケースは増える一方だし、なかなか重宝しそうで良い感じ。
9/30 追記:
メモリ使用量についてもなかなか優秀な模様。
http://wb.cocolog-nifty.com/blog/2010/07/phpcurl_multi-p.html