[PHP] curl_multiでhttpアクセスを並列化

  • 2013年03月12日
  • PHP

httpアクセスを並列化するには

今作っているのは自作アプリ用のwebサービス。
メインのphpのページから、同じドメイン内の20以上のphpファイルにアクセスする必要があります。
それぞれのphp内では外のサイトのデータを取得して解析するので、ものによっては実行完了までに数十秒かかります。

全てのphpへのアクセスを直列で行うのでは全体が完了するまでにかなりの時間を要するので、並列処理することにしました。

といってもphpは初心者なので、、、スレッドを生成するにはどうすればよいのか調べてみるとcrul_multiという関数群を使えば並列処理ができるということがわかりました。
PHP: cURL – Manual

curl_multi参考サイト

curl_multiを使った並列処理はあちらこちらで解説されているので、ほぼコピペで動かせそうなのもよいところです。
APIとの通信効率をよくする実装例(1) curl_multi – Yahoo! JAPAN Tech Blog
curl_multiでHTTP非同期リクエストを行うサンプル #PHP #HTTP – Qiita
phpでapiを使うなら必須なcurl_multi | エンジニア開発記
PHPでマルチスレッド(バックグラウンド処理)を実現する方法 – EC studio 技術ブログ

この辺を参考にして実際に動かしてみました。

原因不明のエラーが頻発

実行時間については期待した通り、全体の処理時間がボトルネックになるphpの処理時間+αくらいになりました。
しかし、計20ファイルに並列にアクセスするとそのうち1ファイルにエラーが発生することが頻繁に起こりました。
URLの配列を並べ替えて実行してみると、今度は異なるファイルにエラーが頻発します。
が、必ずエラーになるというわけでもない。。。

どこかに上限があるのかと、phpinfoで調べてみてmax_file_uploadsの値が20になっていたので、試しに40に変更してみましたが効果なし。

しばらく調べてみましたが、私には原因が特定できず。。。
レンタルサーバーなので、どこかで制限をかけているのでしょうか?
結局原因の特定を諦め、処理時間は伸びてしまうのですが10ファイルずつの並列処理を2回にわけて行い、最後に結果を結合させることで回避しました。

もしこのブログを読んで原因が分かる方がいらっしゃいましたら教えて下さい。