G R A N A D A > ブログ >

« メガマック | メイン | 最近ねちゃう »

SQLが2回実行される恐怖のGoogle AdSence

というわけで、昨日投稿したかったネタ。


実は、とある検索システムで、
検索用語のトラッキングを行うため、
検索が行われるたびに、その用語をテーブルに格納し、
すでに格納されている用語ならばUPDATEでカウント+、新しい用語ならINSERTという
システムを作ってました。

で、テスト環境でOKだったから本番環境にリリースしたら、
そこで問題発生。

なぜか、検索すると、カウントが「2」ずつ増える。


明らかにUPDATEのクエリーが2回発行されている模様。


ところが、テスト環境ではそんな現象はなかったし、
(xoopsで作ったシステムなので)MySQLのデバグモードに設定し、
実行されたSQLをすべてダンプしても更新のSQLは「1回」しか実行されていない。


ナゼダナゼダ!!!

と超悩む。

MySQLの不具合!?
プログラムの不具合!?


まぁとにかく、SQL文のある部分に echo を入れても、1度しか文字列は
echoされないので、「自分」がリクエストしているページは「1回」しか実行されていないのは確実だったわけです。

で、とにかく動向がおかしいのは、

・ F5リロードではカウントアップは1だけ。
・ 1増えて、もう1増えるまでに2秒ほどのタイムラグ
・ プログラム内で実行されているSQL文は1回のみ

なのに、2回実行されている。


これは、


「自分以外の誰かがこのページにもう一度リクエストをかけている」


としか考えられカンジでした。


それで、どうしても腑に落ちなかったので、
アクセスログを解析。
Apache のログを解析してたら、なんか怪しいログを発見。


自分のアクセスの直後に、

「Mediapatner-Google」

というユーザエージェントでGETがかかっていました。


これ…。

もしかして…。

結論。
今回の原因は、

AdSence

でした。


検索システムはPOSTではなくGETでしていて、
検索語がURLに含まれる形だったのです…。

で、GoogleAdsenceは、コンテンツの内容を判断して広告を表示するから、
掲載ページがリクエストされたときに、Googleのロボットが内容判断にGETしてきて、
それから広告を表示するという仕組みのよう。

なるほど…
タイムラグがあったのもの納得。


まぁたしかに今回はGETでUPDATEかけてるのがちょっと嫌なカンジだったとはいえ、
まさかそんなことが起こるとは…

まぁGoogleのUA判断してクエリー投げないようにしときましたよ(笑)


ちょっと勉強になった。

コメントを投稿

トラックバック

このエントリーのトラックバックURL:
http://www.sotaro-k.com/mt/mt-tb.cgi/221