マルチユーザーゲームを実装したいので、クライアントサーバーアーキテクチャを使用する必要があります。マシン上で実行され、ゲームの状態を追跡する単一の永続的なサーバープロセスを設定します。各ユーザーリクエストは、ゲームサーバーと通信して必要なすべての情報を要求するPHP「クライアント」スクリプトによって処理されます。
このようにして、すべてのRoom
オブジェクトとすべてのプレーヤーの状態が1つのプロセス(サーバー)に存在します。Webサーバー(ゲームサーバーと混同しないでください)はクライアントスレッドを起動し、任意の方法でゲームサーバーと非同期で通信します。
状況が非常に単純な場合は、サーバープロセスを、ゲームの現在の状態のスナップショット(アクティブな部屋と関連するプレーヤーの完全なリストを含む)を格納する一元化されたデータベースに置き換えることができる場合があります。各ユーザーリクエストは、データベースからゲームの状態をロードし、変更を書き出します。しかし、実行時間の長いサーバーの方が簡単な方法だと思います。
編集:あなたの質問は、PHPがどのように機能するかについての混乱を示唆しています。サーバーがユーザー要求を処理するために起動するPHPスレッドは、非常に短命です。1時間そこにいた5人のプレーヤーがいるとしましょう。数分または数秒ごとに、プレーヤーがWebサーバーにリクエストを送信します。サーバーは、リクエストを処理して終了するPHPスレッドを起動します。ゲームは数時間続く可能性がありますが、ほとんどの場合、実行中のスレッドはなく、カウントするクラスのインスタンスもありません。常に、アクティブな接続がないプレーヤーがいることになります。したがって、リクエスト間でゲームの状態を保持するために、ある種の永続的なエンティティが必要です。また、それを一意にすることもできます。
編集2:少し頭がおかしいようですので、2番目のオプションを選択する必要があります。プロセス間通信を忘れて、データベースにゲームの状態を保持します。
各phpリクエストは1人のプレイヤーのアクションです。ユーザーがボタンなどをクリックすると、phpスクリプトがデータベースから、ゲームの現在の状態をモデル化するために必要なすべての情報をロードします。必要なハウスクリーニングを実行し(ずっと前に再生を停止したユーザーを非アクティブ化し)、ユーザーのアクションを処理し、データベースへの変更を保存して、ユーザーの新しいページを生成します。その後、終了します。それはすべてほんの一瞬です。次に、次のユーザー(または同じユーザー)が別のアクションを送信し、最初からやり直します。
並行性についてはどうですか?多くのユーザーを獲得でき、スクリプトが非常に遅い場合を除いて、スクリプトはありません。一度に実行するスクリプトのコピーは1つだけです。同時実行を禁止する場合は、データベーストランザクションを使用して、ユーザーアクションが一度に1つずつ処理されるようにします。それでも不十分な場合は、クライアントサーバーアーキテクチャ、プロセス間通信、およびクライアントサーバーソリューションに必要なその他すべてのことについて学びます。