3

これが私の問題です。タイトルを見て、「PHP はサーバー側の言語であり、クライアント側の問題であるため、PHP はユーザー入力を待機しない」と考えた方のために、私の話を聞いてください。

ゲームを作っています。これはマルチプレイヤー ゲームであるため、複数のユーザーが対象です。各ゲーム ラウンドの開始時に、ゲームに参加しているユーザーは、そのラウンドでやりたいことを選択するよう求められます。もちろん、全員がそのラウンドでやりたいことを選択するまで、ラウンドは開始されません。

ほら、それは私の問題です。「すべての」ユーザーがリクエストを送信する (入力を送信する) までスクリプトを待機させてから、実行を続行するにはどうすればよいですか? サーバー側の言語は PHP です。クライアントは1人のユーザーに対してのみ責任を負い、他のユーザーが何をしているかを知らないため、答えはクライアントにはありません。

ありがとう。

4

2 に答える 2

3

基本的に、次の 2 つの選択肢があります。

選択肢 1 では、必要なデータがすべて揃っているかどうかをスクリプトごとにチェックし、すべての作業を実行して次の移動 (またはその他) を計算します。並行性の問題が発生するため、これを正しく行うのは思ったよりも実際にははるかに困難です。

基本的に、そのアプローチは複数の「プロセス」(ページの読み込み)につながり、同じデータに対して同じ作業を実行しようとします。これにより、作業をまったく行わない、または行う場所での競争への扉が開かれます。それを2回。

難しそうに聞こえる選択肢 2 では、別の PHP スクリプトを作成して、すべての動きがあるかどうかを確認し、結果を計算し、バックグラウンドでデータベース (またはその他のもの) を更新します。

次に、それを cron ジョブなどから実行して、一度に 1 つのインスタンスしか実行しないようにします。これにより、作業が楽になります。「すべて完了」スクリプトは 1 回だけ実行されるため、競合について心配する必要はありません。

このアプローチは実際には長期的にはより簡単です。なぜなら、より多くのコードとより多くの可動部分が含まれますが、実際にはいくつかのより簡単な問題 (cron を使用して少し多くのコード) と引き換えに難しい問題 (並行性) を回避できるからです。

もちろん、これらの両方を改善することはできますが、これらは基本的なモデルです。ロックやその他の調整手法を使用すると、「最後のページで計算」をより適切に機能させることができますが、競合に対処する必要があります。

さまざまな「バックグラウンド ジョブ」ツールを使用すると、タイマーではなく即座にチェックをトリガーできるため、2 番目のアプローチのレイテンシを改善できます。多少の遅延はまだありますが、ユーザーにはそれほど多くは見えません。

ただし、実際には、これら 2 つの戦略のいずれかを選択して、それに従うことができます。

(また、可能であれば、他の誰かがこれらの問題を既に解決しているフレームワークまたは何かを入手して、それを使用することを強くお勧めします。)

于 2012-09-11T23:04:21.903 に答える
0

データをプッシュすることはできないため、次のように対処します。

  1. DBなどのサーバーで送信された情報を収集します
  2. クライアント側スクリプトを実行して、必要な情報がすべて利用可能かどうかを定期的に確認します
  3. クライアントで応答を評価します: true の場合、ゲームを開始します - そうでない場合は、「待機」 = チェックを続けます

だからあなたが必要です:

  • 情報を収集するサーバー上のスクリプト
  • すべての情報が利用可能かどうかを確認するサーバー スクリプト
  • 定期的にチェックして評価するクライアント スクリプト
于 2012-09-11T23:11:37.520 に答える