最安値複数ECサイト横断検索 light Ver.1.0リリース!と高速化の手法

スクリーンショット(2010-02-20 10.22.33).jpeg

これはあくまでもサンプルソースなので、メンテナンスなどはしていませんが、ちょっと触る機会が何度かあったのでアップグレードしてきました(昨年開催した勉強会とか勉強会とか重ねるうちに)。あくまでも勉強会参加者に先行して公開していて、一般には公開していませんでした。

過去の記事を参考にしていただいて、熱心な方からコメントも戴いているうちに、載せる義務も無いのですが、出し渋りする理由も無いので、一旦この場で 公開とさせていただきたいと思います。

ダウンロードはこちら:複数ECサイト横断検索 light Ver.1.0

横断検索テスト – [Mu]ムジログより引用:

こちらを試させて頂きましたが、検索結果表示も早く、理想のものに近いです。

5月にお書きになっている分を現在使用させていただいておりますが、自分で試してみたところ、表示が遅かったり、回避されてしまいます。

今回の「お茶」の分は、前回より手が加わっているのでしょうか?

よろしければ、違いを勉強したいと思っておりますので変わっているようでしたら、ダウンロードかメールで添付していただくことは可能でしょうか。是非お願いいたします。

見た目はあまり変わらないと思いますが、中身は大幅に変わっています。

一番大きな違いはAPIへの直列通信から並列通信に変えた部分です。

従来であれば、楽天、ヤフー、アマゾン・・・と順番にAPIにリクエストしていきましたが、これだとそれぞれの時間がかかってしまいます。それぞれ0.1秒かかるとして7種リクエストしたら0.7秒という単純計算です。

これを並列通信(同時にAPIにアクセス)にすると、それぞれ0.1秒かかるとして全部処理しても0.1秒で済むわけです。

さらに「5秒」というタイムアウト制限を付けているので、異常に重いAPIについては処理がキャンセルされます。5秒でも長いと思うのですが、実際に表示されるまで13秒とかは待ちたくないでしょう。そういう意味でも表示速度を優先させました。

さらにキャッシュの部分にも手を加えました。

以前だと各APIごとに取得したXMLキャッシュを保存していました。

今回は表示した画面ごとキャッシュするようにしました。

これによって最終的に表示される内容に特に変わりはありません。

そうすることによって、キャッシュファイルの数が激減し、そして、XMLからHTMLへ書き出すPHPプログラムの負荷がなくなります。アクセスが大きいサイトだとこれ効いてくると思います。

というわけで、大幅に手を加えて、高速化処理をしているのです。

ご参考になれば、幸いです。

ちなみに一部参考にしたのはこの本です。

コメント

  1. ソースを試させていただいたのですが、楽天だけ以下のようにエラーが出て、データが取れないのですが、何か対策はありますでしょうか。
    CURLOPT_TIMEOUTの値を変えたりしてみましたが特に改善は見られませんでした。
    Warning: Invalid argument supplied for foreach() in /home/

  2. いつも興味深く拝見させて頂いております。light Ver.1.0をサーバーにアップしているのですが、全く動きません。
    検索窓も表示されない状況です。
    各PHP内に「Cache/Lite.phpがはいっていることが前提」とありますが、あれは、入っていないサーバーでは何も起こらないということでしょうか。
    ちなみにサーバーは、さくらレンタルサーバーです。
    宜しくお願いいたします。

  3. mrharn様>
    ご利用いただき、ありがとうございます。
    > 各PHP内に「Cache/Lite.phpがはいっていることが前提」とありますが、あれは、入っていないサーバーでは何も起こらないということでしょうか。
    その通りでしたが、最新版では同梱していました。そのコメントで混乱させてしまい、申し訳ございません。
    (API勉強会等でサンプルを配布したときに、さくらなどで動かない問題があったのでその対応をしていました)
    さくらインターネットのサーバを使っていないので何とも言えませんが、問題を切り分けてみるとPHPのバージョンが異なっている可能性も考えられます。
    何も表示されないのは、エラーが起きていることが原因なので、一端下記方法でエラーメッセージを表示させてみて、何が原因か突き止める必要があります。

    // エラー表示止め
    ini_set(‘error_reporting’, E_ALL | E_STRICT);
    ini_set(‘display_errors’, ‘off’);

    このエラー表示止めの2行を下記のようにコメントアウトしてください(必ず半角入力モードで編集してください)。
    コメントアウトとは行頭を「// 」という文字を入れることによって無効化することです。

    // エラー表示止め
    // ini_set(‘error_reporting’, E_ALL | E_STRICT);
    // ini_set(‘display_errors’, ‘off’);

    これでエラーメッセージを確認してください。
    検索窓すら表示されないのはindex.phpでエラーが発生しているからです。ヤフーの急上昇キーワードのAPIも使用しているので、ヤフーのデベロッパーIDを間違えているとかが考えられます。それ以外にも改行コードや文字コードを誤って保存したとかでPHPが動かないケースがあります。Windowsのメモ帳でPHPを編集していたりするのが原因がわからない初心者にありがちなポイントです。
    一度エラーメッセージを表示させてみて、状況を確認してみてください。

  4. wackeyさん>
    返信が遅くなり申し訳ありません。
    Cache/Lite.phpの件ですが、勉強中でそれが何だかわかっていませんでした。今も、若干理解していませんが、wackeyさんのサイト内で同梱されていたヴァージョンをインストしたら正常に動きました。
    今後、CMSと組み合わせてコンテンツのあるサイトに仕上げていきます。できたら、Twitterなどで報告します。
    では。有難う御座いました。

  5. はじめまして。少し前から試させて頂いておりますが、やってみたいことがありまして、一つ質問させて下さい。
    どうにかして、全てのAPIで「OR検索」を導入したいのですが、楽天APIしか分かりません。
    何か良い方法はないものでしょうか?
    宜しければ助言下さると助かります。どうぞ宜しくお願いいたします。

  6. charaさま>
    コメントありがとうございます。
    さて、OR検索ですが、それぞれのAPIの仕様書を見ていただいて、ひとつずつ対応していただくことが必要になります。
    ご存知の通り楽天の場合はパラメータの追加で可能ですが、それ以外の場合はパラメータの追加では無い方法のほうが多いでしょう。
    例えばリンクシェアクロスオーバーサーチの場合は現状「keyword」指定しているのを「one」指定するようにパラメータ自体を差し替える必要があります。
    その他、検索エンジン系とところだと、その検索演算子が使えるという事例もあるので、入力された文字列を加工するようにすればカンタンに出来ると思います。
    ひとつずつ仕様書を見て、ひとつずつ片付ければカンタンにできることですので、お試しください。

  7. wackeyさん>
    ご丁重な回答を下さって有難う御座います。
    その後、色々と探って試してみましたが、どうしても分からないので、「OR検索」について再度質問させて下さい。
    YAHOO!ショッピングリクエストの部分ですが、どこを差し替えることになるのでしょうか?
    type=anyを追加した場合に検索結果が返ってきませんでした。ご回答では差し替えとのことでしたので、どこを削り替えればよいか分かりません。
    そもそもtypeのそれぞれのパラメータは
    any→or検索
    all→and検索
    という認識でいますが、これは合っていますでしょうか?
    合わせてご回答いただけると助かります。
    宜しくお願いします。

  8. charaさん>
    OR検索についていろいろとチャレンジして下さり、ありがとうございます。
    さて、いただいた質問ですが、パラメータを差し替えるのはリンクシェアの場合のはなしで有り、ひとつひとつのAPIで対応方法が異なりますので、ご注意ください。
    さて、YAHOO!ショッピングの場合は検索エンジン系の会社なので、検索エンジンの演算子の考え方が使えます。それをクエリーにすれば良いです。
    ただし、ショッピングの場合少し演算子が違うようなので、一度、ショッピングで何かをor検索させてみて演算子を確認する必要があります。
    例えば「木」or「みかん」のor検索を行うと、
    (木 みかん)
    といった形で検索窓に設置されているのがわかります。つまりこの形にキーワードを加工してURLエンコードしてリクエストしていただくと、そのような結果がわかります。
    自作WordPressプラグインの動作で恐縮ですが、確認画面を作りましたので、リンクをクリックして検索させてみてください。
    http://vcsearch.web-service-api.jp/2010/04/29/test-ringo-mikan/

  9. wackeyさん>
    非常に分かりやすいご回答有難う御座います。なるほど、そういうことですね。一つ解決しました。
    実際に試してみましたところ、上手く結果も出るようになりました。
    コメントを独占して申し訳ありませんが、これで最後にしたいと思っておりますので、再度ご回答いただけないでしょうか。
    質問したいことは、アクセストレードリクエストのOR検索方法。読んでみると検索はsearchが10個まで検索できると書いてありますが、試したところ、どうもand検索のような感じで結果が出るみたいです。OR検索できないか調べましたがよく分かりませんでした。
    どうぞ宜しくお願いいたします。

  10. charaさん>
    さすがに同じような項目で3つ目の質問をされると、戸惑ってしまいます。
    本来であれば、仕様書で確認していただくか、API提供会社に質問のメールを送るとかしていただく内容の範疇をお答えしてきたわけですが、このサンプルソースのサポートの範囲からは逸脱している、と感じています。
    特にアクセストレードはほとんど使っていないので、調べてお答えするのも、なんか筋が違うなぁと思っています。
    (本来はAPIの仕組みを提供している会社もしくはその仕様書レベルの範囲です)
    とは言っても、いろいろと調べたり仕様書を読んだり努力はされていると思うので、ヒントだけ申し上げておきます。
    仮にOR検索を使えないAPIの場合、複数のキーワードに分割して、そのキーワードごとにリクエストを投げます。それを配列変数に格納して、安い順にソートして表示するという流れです。
    このサンプルソースもあらゆるAPIの結果を配列変数に格納して、ソートしています。単純にAPIへのアクセスをORのキーワード数分追加していくだけです。
    わからなかった場合、解決しなかった場合はそういうやり方もある、というヒントだけ書いておきます。
    ボクもAPIを扱うプログラミングの勉強会の講師役をやってきていますけど、自分も含め、いろんな参加者を見てきて、どのように問題解決をするか、という考え方を身につける必要があります。
    ここにコメントを書かれているのも必死なんだからと思いますし、それも自分も経験してきているので、よくわかります。でもこれからは、そういった勉強会などのコミュニティに属した方が、その空気から感じられる問題解決の方法やテクニック、良いネタなどを常に触れて活かせていけると思います。
    charaさんの作っているサイトのためにも、オススメします。ぜひ、頑張って仕上げてください。

  11. 超便利なのでみんなに「複数ECサイト横断検索」を配布している者です。
    自分のホームページで配布し、さらに2ちゃんねるでもこのプログラムを
    みんなでコネクリまわそうと思います。
    2ちゃんねるのスクリプトも、みんなで開発し広まったように
    この「複数ECサイト横断検索」も、やがては誰が開発者だったかわからない
    ほど改良が加えられていくことでしょう。ヽ(●´w`○)ノ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です