POSTでリクエストするとファイルをダウンロードするという機能があるときダブルクリック対策のようなことがしたい。

ボタンをクリックするとファイルを生成してダウンロードするという機能があり(PHP5)、header関数でヘッダ操作もしています。
このときダブルクリック(2回クリック)対策として、1回目のクリックで処理の前にクリック判定用の一時ファイルを作る⇒その後メインの処理。2回目のクリックのとき判定用ファイルの有無と判定用ファイル作成時間(一定時間経ってたらOK)から判定して、NGのときはメインの処理を行わず画面をリロードする、というような処理を書きましたが、うまくいきませんでした。具体的にどうなったかというと2回クリックしても(若干重くなった感じで)ふつうに処理が行われます。クリック判定の処理が割り込めてない?ような感じです。
何か良い方法はないでしょうか。

回答の条件
  • 1人5回まで
  • 登録:2009/03/18 03:03:47
  • 終了:2009/03/18 23:51:41

回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/03/18 06:56:10

ポイント23pt

クリック判定用の一時ファイルの存在チェックを行う部分だけでもソースを見せていただかないと、何とも言えません。

まずは、以下の点をご確認下さい。

  1. クリック判定用の一時ファイルはつくられていますか?
  2. クリック判定用の一時ファイルを手作業で作成し(ダミーファイルを作る)、問題のスクリプトを実行してみて下さい。正常に動作しますか?
  3. クリック判定用ファイルがあるとき画面をリロードするとなっていますが、ここで画面をリロードすると、クリック判定用一時ファイルの存在チェックを無限に繰り返すことになりませんか?

※1で判定ファイルが無いなら一時ファイル作成ロジックに問題があります。2で画面リロードが起きないなら存在チェックのロジックに問題があります。

id:tiritomato

1.作られています。

2.ファイルがある状態でも判定まで行われません。ただメインの処理のファイル生成時にデータの少ない場合だと思っていたとおり動くことがあります。データが多くなってファイル生成が重くなると動かなくなるような感じです(このあたりをもう少し厳密に調査してみます)

3.リロードというか元のクリック前の画面に一度リダイレクトしてるだけなので無限にリロードしてることはありません。

2009/03/18 08:50:37
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/03/18 09:23:34

ポイント23pt

#1で回答した者です。確認をありがとうございます。

2.ファイルがある状態でも判定まで行われません。ただメインの処理のファイル生成時にデータの少ない場合だと思っていたとおり動くことがあります。データが多くなってファイル生成が重くなると動かなくなるような感じです(このあたりをもう少し厳密に調査してみます)

ソースを見ないと何とも言えませんが、2回クリック対策をしているということは、クリックをしてくるクライアント毎に判定ファイルを発生しているということですよね。

となると、ファイル数が膨大になり、アクセスしてくる度に膨大なファイルをチェックすることでサーバに負荷がかかっていませんか?

また、クライアントの識別は何で行っていますか? refererで送られてくるIPアドレスですか?


Cookieによる重複カウント防止の検討はされましたか?

id:tiritomato

ファイルが膨大にならないような制御はしています。いまは開発段階なので、作ってるファイルもひとつだけですね。なのでファイルが膨大になることで負荷になってるのでなくてメイン処理のファイル生成でバッファを使ってる感じです

2009/03/18 09:45:17
id:pahoo No.3

pahoo回答回数5960ベストアンサー獲得回数6332009/03/18 12:50:00

ポイント22pt

なのでファイルが膨大になることで負荷になってるのでなくてメイン処理のファイル生成でバッファを使ってる感じです

うーん、どのようなバッファ処理をしているのか、イメージが掴めません。


もし単一ファイルで管理されているのだとすると、以下の制御だと行が無限に増えてしまいます。

  1. 誰それ(IPアドレス情報?)が何年何月何時何分何秒にクリックした。
  2. 判定ファイルから「誰それ」を抽出する。
  3. 2の情報の中で最も時刻の新しい行を取り出し、1の時刻情報との差分が一定値より小さければ重複クリックと判断する。
  4. 1の情報を判定ファイルに加える。

行が無限に増えるのを防ぐには、適当な間隔で時刻が古い行を削除してやる必要があります。

この処理間隔が短すぎるとサーバに負荷がかかりますし、長すぎるとファイルが長大化するので、やはりサーバに負荷がかかります。

Cookie処理にすれば、これらの問題は解決します。

id:tiritomato

ありがとうございました。

出していただいた方法で検討したいと思います。

2009/03/18 23:51:25
id:khazad-Lefty No.4

khazad-Lefty回答回数181ベストアンサー獲得回数272009/03/18 13:02:29

ポイント22pt

PHPは専門じゃないですが一般的な話として。

ファイルの書き込みは遅延がある気がするので、こういう場合はうまくいかない気がします。

思いつくのが、セッション変数でフラグ(最終更新時間)を設定するとか、JavaScriptでボタンを使用不可にするとかですね。

というか#2であげられてるCookieによる方法が一番いいのかもですね。(詳細は見てませんが)

id:tiritomato

遅延。そういうことかもしれません。

今回の質問で出していただいた方法を検討したいと思います。

2009/03/18 23:51:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません