@toshiyuki83 Webサービス更新履歴&技術情報

PHP(FuelPHP)とかJavaScript(TitaniumMobile)とか、Webサービス情報など

cURLのマルチスレッドで楽天APIをリクエストしたときの記録 #RakutenAPI

激安!1円ショップ」でcURLのマルチスレッドを実現するcurl_multi関数で楽天APIをリクエストしたときの記録です。使用しているAPI楽天商品検索API2 (version:2012-07-23)です。

 

今現在、「激安!1円ショップ」はcURLをシングルでリクエストしていますが、様々な商品を展示したいと思い、curl_multi関数で複数回APIを叩きたいと思い、書き換えを進めていました。

 

同時に5回のリクエストをしましたが、エラーが出ました。実行結果は以下の通りです。

  1回目 2回目 3回目 4回目
1本目
2本目 × ×
3本目
4本目 × × ×
5本目 × × ×

※URLのリクエストのことを◯本目としています。5本目というのはcurl_multiで5回目のAPIリクエストのことです。

 

1本目のリクエストは成功しますが、2本目のリクエストでエラーが出たり出なかったりします。3本目はなぜか成功します。(実験は4回だけなので、必ず成功するわけではないと思います)他は成功したり失敗したりします。5本リクエストを送ると、2本目以降の半分ぐらいはこけてしまいます。

 

これは楽天APIのドキュメントにも書かれていますが、「※短い時間の間に大量に、同一のリクエストURLへアクセスすると、一定時間利用できなくなる場合がございます。テストの際にはご注意ください。」というように、大量のアクセスと判断されているためと思われます。

 

cURLのシングルスレッドで5回リクエスト送るより、curl_multi関数でマルチスレッドのほうが速いですが、肝心のリクエスト先サーバーから、エラーが返ってくる状況ではいかに速くしてもしょうがないともいえます。

 

楽天APIは月毎の使用回数制限ないのはいいですが、同時リクエストが多いと、すぐにエラーを吐いてしまうので、(いろいろな回避方法があるとは思いますが、)大量のリクエストや大量のアクセスがあるようなWebサービスには向いていないといえます。

 

※関連記事

FuelPHPのユニットテストで楽天API系のテストコードが503エラーを返すときの対処方法 #fuelphp