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サービスには向いていないといえます。
※関連記事