Posterous theme by Cory Watilo

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