2012-04-02 3 views
1

私は、Web上で公開することができますが、呼び出されるたびに多くのサーバーリソースを使用します。PHP - サーバーリソースを使用する前にユーザーの待機を実施する

この関数を呼び出すユーザーは、関数が呼び出されるまで(または、少なくとも関数が呼び出される前に)しばらく待たなければなりません。

私は、サーバー側でこの「待ち」を強制して、疑わしいクライアントによって上書きされないようにしたいと思います。 私は、ユーザーがオンラインアカウントにログインすると主張する予定です。

サーバーリソースを使用せずにユーザーを待たせることができる効率的な方法はありますか? これを行うには、 'sleep()'が適切な方法でしょうか? sleep()の使用に関する推奨される問題はありますか? もっと良い解決策がありますか?

私の無知を実感していただきありがとうございます!

+0

なぜ睡眠が助けになると思いますか?私は –

+0

私はそれができないと信じることができます:質問の動機は、何がうまくいくかを見つけることです。 – Ronald

+0

本当にやりたいことは?レート制限? –

答えて

1

sleepたとえば、PHPをコマンドラインツールとして使用していれば問題ありません。ただし、ウェブサイトの場合は、sleepは接続を開いたままにします。あなたのウェブサーバは有限数の同時接続しか持たないので、これはあなたのサイトのDOSに使用できます。

より良いが、より複雑な方法は、ジョブキューを使用することです。スケジュールされたスクリプトによって処理されるキューにタスクを追加し、AJAXまたはメタリフレッシュを使用してWebページを更新します。

+0

私はAJAXを使用していますが、それはおそらくクライアント側であり、クライアントによってオーバーライドされる可能性がありますか?それは間違っていますか? – Ronald

+0

AJAXはタスクを実行していません - 単にタスクを実行しているジョブの進行状況を確認するだけです –

+0

ああ、私は見る!ありがとう!だから...ええええええええええええええええええええええええええええええええええと...私はどのようにジョブキューを設定するのですか;) – Ronald

0

これは、サーバーレベルでの処理が最適です。何度もPHPを繰り返し呼び出す必要はありません。

多くのサイトと同様に、私はNginxを使用しており、それを使用してrate-limitingを使用して、一定数以上の繰り返し要求をブロックします。 IPあたり1時間あたり3つのリクエストがあります。

+0

@RonaldStewart、**は**業界標準のソリューションです。 Apacheを使用している場合は、レート制限を有効にすることもできます。 – Xeoncross

+0

申し訳ありません。最初は最初の段落のみが表示されていました。 – Ronald

1

sleep()は、ほとんどすべての可能性のある状況で悪い考えです。あなたのケースでは、それはクライアントとの接続を開いたままにしているので悪いです。ほとんどのウェブサーバーは開いている接続の制限があります。

+0

はい、それは私が心配していたものです。それを確認してくれてありがとう。 – Ronald

1

sleep()はまったく役に立ちません。ユーザーは同時にページを2回ロードするだけで、コマンドは互いに直後に2回実行されます。

代わりに、関数が最後に呼び出されたときにデータベースにタイムスタンプを保存することができます。次に、起動する前に、適切な時間が経過したかどうかを確認するデータベースを確認する必要があります。存在する場合は、関数を呼び出して、データベース内のタイムスタンプを更新します。

1

あなたがユーザーのログインを強制しようとしている場合、問題はずっと簡単になっています。

データベースをリストしているユーザーと、リソース消費サービスを最後に使用した時間を記録して、現在と現在の時間差を測定します。時間差が小さすぎる場合は、アクセスを拒否し、エラーメッセージを表示してください。

+0

それは私に多くの感謝を、感謝します。 – Ronald

関連する問題