エラーページに変な画像を追加しました
画像素材集を探していたら、良い画像があったので、404などのエラーページに設定してみました。
がっかり感が伝わってきて、良いと思っています。以下のURLなどを見ていただければエラーページが登場します。
送料無料、送料別途、タイムセールを別表にしました。
「激安!1円ショップ」、少し改良しました。今まで、送料無料、
しかし見直しまして、改良後は、送料無料、送料別途
それでは激安の1円ショッピングをお楽しみください!
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
FuelPHPでPHPUnitを使ったユニットテストで楽天API系のテストコードが503エラーを返すときの対処方法です。
「激安!1円ショップ」のような楽天APIを使用するようなアプリケーションを作る際、楽天APIにリクエストする様々なテストコードを書く必要があります。そしてコンソールから「oil test --group=App」というように、全てのテストコードを実行したとき、
Failed asserting that 503 is of type "array".
というようエラーが突如として返るときがあります。これは楽天APIの公式ドキュメントにも書いてありますが、「※短い時間の間に大量に、同一のリクエストURLへアクセスすると、一定時間利用できなくなる場合がございます。テストの際にはご注意ください。」というのが原因です。テストコードの量が多くなるにつれ、リクエストする回数が増えているのです。
一つの対処方法としては「oil test --group=Rakuten」というように、ユニットテストのクラス毎に実行させることですが、一度に全てのテストを行いたいときもあると思います。そのようなときはsleep関数がお手軽です。
class Test_Model_Rakuten extends TestCase
{
(※中略)
}
sleep(5);
というように末尾にsleep関数と待つ時間を入れれば、テストをクリアすることができました。(私の場合、5秒でした)
全商品1円で購入可能な「激安!1円ショップ」を作りました!(FuelPHP+楽天API) #fuelphp
「激安!1円ショップ」とは、1円で購入可能な商品のみを集めたWebサービスです。1円で販売している商品のみをECサイトから収集を行い「激安1円ショップ」に掲載をしています。
経緯
私は個人開発者としては、APIをベースとしたWebサービスを作るのが好きで、今まではYahoo 画像APIを使ったWebサービスをいくつか作ってきました。(現存しているものはこれやあれ)
一時期、使用回数無制限ということもあり、精度も悪くないことから、Bing画像APIに乗り換えていました。しかし、Bing画像APIが使用回数制限を設けてしまったため(しかもYahoo APIより使用回数が少ない)、再度Yahoo APIに乗り換えて、細々とサービスを続けています。
APIの使用回数制限についてはテクニックを使えば、APIの使用回数を節約していくことは可能なのですが、趣味Webサービス作りに関しては、できれば節約のことを考えずに、パッーと使いたいところです。
そんな中、次に遊ぶことのできるAPIを探していたところ、私が目につけたのは楽天APIでした。リクエスト回数制限が基本的(※1)には存在せず、場合によっては楽天アフィリエイトでの収入も見込めるという趣味と実益も兼ねる可能性を秘めたAPIです。
APIの種類がかなり多く(※2)、眺めているだけでも、たくさんのアイデアが出てきて、わくわくします!
さらに開発者を助ける便利ツールも提供されています!
「APIテストフォーム」 - 最近のAPIによくあるAPIの挙動を試せるAPIエクスプローラー的なものです。getパラメーターを含んだリクエストURLをコードに記載する前にWeb上で確かめることができます。
「APIモニター」 - 正常レスポンス率、レスポンスタイムがAPIごとに一覧表で表示されています。反応が鈍いAPIや重いAPIなどといったAPIがすぐにわかります。なんと現在の数値だけではなく、一週間前までの数字を見ることができます!これは信頼できます。
数字嫌いな人に見せたところ、「寒気がする」ということでしたが、数字が好きな僕にとっては、とってもわくわくする表です。実際の表をここに見せたいのですが、許可を取っていないため、掲載はやめています。ぜひとも実際に確認してみてください。
FuelPHP
このWebサービスもまた、FuelPHPで構築しています。バージョンは1.4です。公開しているWebサービスとしては5つ目のFuelPHPでの構築です。難しいことはやっていないのですが、だいぶ慣れてきました。今回は初めてテストを書きながら、構築しました。
なぜFuelPHPかというのは、FuelPHPで横断力技検索をリニューアルいたしました #fuelphpの記事をご覧ください。その他にもあります。(※3)
激安!1円ショップ
アプリの話に戻りますが、激安!1円ショップは楽天の商品検索で1円の商品だけを引っ張ってきて、表示しているWebサービスになります。実際にAPI開発をされている方であれば、「なるほど」となると思います。1円で購入できる商品は、サンプル品が多いですが、実際にお得な商品もあると思いますので、ぜひ掘り出しものを発掘してみてくださいね!
※1 「※短い時間の間に大量に、同一のリクエストURLへアクセスすると、一定時間利用できなくなる場合がございます。テストの際にはご注意ください。」という制限はあります。
※2 約40種類ぐらいあります。今はAPIバージョンの移行期らしく、バージョン1と2の両方が提供されています。1を除いて約40種類ほどでした。
※3
FuelPHPで「アイドルお宝画像速攻検索」をリニューアルいたしました #fuelphp
FuelPHPで任意のViewにステータスコードを設定する方法 #fuelphp
Fuelphpで既存に用意されている404を使わずに任意のViewにステータスコードを設定させたいときの方法メモ。
Fuelphp1.4で404や500以外にも様々なステータスコードを返すことをしたいと思いました。 当初はここの記事を参考にして、ステータスコードをheader関数で設定しようとしましたが、どのステータスコードを設定しても、サーバー上で500のエラーが出る状態。
Twitterに投げかけたところ、「header関数はHTTPヘッダを送信する関数なので、関数使う前に文字を出力していると無効になっちゃいますね」と教えていただき、これはFuelphp的な問題だと気づきました。
結論としてはFuelphpの作法でステータスコードを設定する必要があります。 Rest コントローラ - 概要 - FuelPHP ドキュメントにありました。
response($data = array(), $http_code = 200)
とありました。実際にControllerでViewを生成するところに当てはめてみます。
$view = View::forge('sample/error'); // Viewファイルの指定
$view->set('test',$test); // 値を渡す
return Response::forge($view,404);