メイン

2007年07月01日

技術系記事は

はてなで書いてるです。

http://d.hatena.ne.jp/sotarok/

こっちの情報ちょと古いかもです?
わからないです

2007年03月03日

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


ちょっと勉強になった。

2007年03月01日

ON DUPLICATE KEY UPDATE

使い方。



mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;


ええええええええーーーーーーーーー!!!!!!!!!!!


なんだこの便利な・・・!!!!


今まで、

1. ある条件のものを取りだす
2. 行数を数える(rows num)
3. ifで「0以上ならUPDATE」「0ならインサート」

って書いてた処理を、
1行のSQLであらわせる。

ちょっと・・・・


俺1年間なにしてきたんだろorz


実装したらコード晒してみます。
手っ取り早くカウンタでも作ってみようかな。