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判断してクエリー投げないようにしときましたよ(笑)
ちょっと勉強になった。






