Personal tools

AmazonSimpleAdmin をハックするメモ

written by ultraviolet on

AmazonSimpleAdmin を改造してみようとふと思い立ち、内部動作を追ってみたけど、明日になったらたぶん忘れてるので、メモ。

Amazon 商品をポストに埋め込む plugin としては wp-amazon も知られてますけど、これと AmazonSimpleAdmin plugin でどこが違うかと言うと、wp-amazon はポストを書くときに amazon にクエリかけて情報を引っ張ってきてポスト本文中に埋め込むのに対し、AmazonSimpleAdmin はポストを表示する際に amazon に情報を引っ張ってくる、というのが最大の違いです。

AmazonSimpleAdmin の長所は、中古商品情報も常に最新のものが表示される、というところです。例えば以下のような感じで。

[asa book]4774124966[/asa]

一方 AmazonSimpleAdmin の欠点は、まさにこの長所の裏返しで、ポストが閲覧されるたびにクエリを投げるという点です。実際いま wordpress.rauru-block.org サーバ上で tcptrack 走らせてみたら、www.amazon.jp にわらわら繋ぎに行ってる。
これはサーバとして問題だよなあ。だって、ロボットが拾いに来るたびにクエリが走るわけだし。もっと問題なのは RSS Feed だな。うちは20件を Feed で流してるけど、もし20件とも amazon 商品タグが貼り付けられてるとクエリの回数がとんでもないことに。クエリを処理し切るまで apache のプロセスが1個占有されるわけで、とてもよろしくない。

しかし、クエリ結果をキャッシュしとけば結構安心じゃね? ちょうどほら XCache も入れてるからちょうどいい。
WordPress の cache の使い方は簡単です。Codex に WP_Object_Cache の使い方の説明 がありますが、まさにこういう外部サイト問い合わせの時の使い方が例として載ってたり。

というわけで、AmazonSimpleAdmin がクエリ結果をキャッシュするよう改造するにはどこをいじれば良いんぢゃろか、と調べてみました。以下はその途中経過。

  • amazinsimpleadmin.php は AsaCore.php を呼んでるだけで、あまり中身は無い。
  • コンストラクタの中で parseContent メソッドが the_content フックに add_filter される。
  • parseContent メソッドでは、$content の中を preg_match_all で舐めて、[asa] 記法のところを見つけてきて、1個1個 str_replace で置換をかける。
  • 置換内容を作るのが _parseTpl($asin,$tpl) メソッド。
  • _parseTpl の中で _getItem($asin) メソッドが呼ばれ、そっから $this->amazon->itemLookup() メソッドが呼ばれる。この時の引数が 'ResponseGroup' => 'ItemAttributes,Images,Offers' になってる。このメソッドが実際クエリ投げてるな。

ちなみに itemLookup メソッドは AsaCore.php の中にはありませんでした。amazon プロパティが $amazon = new Zend_Service_Amazon($amazon_api_key); とかいって生成されてるので、Zend Framework の中にあるメソッドだな。ここを呼ぶ前にキャッシュをチェックして、キャッシュされてたらその値を使うようにすれば勝ちだな。キャッシュのキーは ASIN 使えばいいから楽勝。

あ、しかしこれ、コンストラクタの中で Zend_Service_Amazon 呼ぶのか。まさかこの時点で (つまりポストの本文をパースする前に) amazon に TCP 張りに行ったりする? Zend のドキュメント 読んでもその辺書いてないな。むー、Zend Framework のソースの中見なきゃいけない?


Leave Your Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

« Back to text comment