人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: tiritomato
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ng ふつう クリック ダウンロード ダブルクリック
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● pahoo
●23ポイント

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

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

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

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

◎質問者からの返答

1.作られています。

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

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


2 ● pahoo
●23ポイント

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

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

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

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

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


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

◎質問者からの返答

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


3 ● pahoo
●22ポイント

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

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


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

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

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

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

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

◎質問者からの返答

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

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


4 ● khazad-Lefty
●22ポイント

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

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

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

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ