親愛なる開発者の皆様!
私はネットワーク プログラミングのプロではありませんが、たまたまフラッシュ マルチプレイヤー ブラウザ ゲーム (ロケーション、チーム バトルなどの標準機能) のために、PHP でソケット サーバーを開発する必要に迫られました (Java を使用する方法はありません)。
主な問題は、TCP がポイントツーポイント プロトコルであり、特定のポートを完全に占有することです。
もちろん、ソケットへの接続を管理するある種のキューを作成することは可能ですが、このソリューションは最適なものではないようです。
1 つのリクエストの実行に時間がかかり、プレイヤーがキューで待機することを快く思わないため、「公平な」ポート間隔 (たとえば 2000 から 2200 まで) を使用する方が適切な解決策であるように私には思えます。
しかし、この「ポート間隔」戦略をどのように実装できますか? 私が見る解決策は次のとおりです。
ポートごとに php-script を起動します (200 ものスクリプトが起動されます!)。
どういうわけか、最初のプロセスを新しいプロセスにフォークします (200 のプロセスが処理されましたか? あまりにも良くありません)。ポートごとに 1 つです。
- すべてのポートをリッスンする追加の while ループ (非常に見栄えが悪い)。
- スレッディングまたはそのようなものを使用します(問題は、私が知る限り、phpがシングルスレッドであることです; pcntl?)。
しかし、どういうわけか、私はそれらのどれも気に入らないか、少なくともそれらを可能な限り最良の方法で実装する方法を知りません.
時間単位ごとに複数のユーザーからの複数のリクエストを遅滞なく処理するための最善の既存の戦略と、この戦略をphpで実装する方法は何ですか? 独自の Debian サーバーがあるため、必要な php 拡張機能を使用することができます。
この種のシステムの開発、計画、および実装に関するアドバイスをいただければ幸いです。
ありがとう!
編集1: ちなみに、いくつかの追加の詳細について言及するのを忘れていました.
たとえば、チャット アプリケーションを開発しようとしている場合、ユーザーごとにある種の固定 (永続的な) 接続が必要です。たとえば、チャットに 80 人のユーザーがいて、そのうちの 1 人がメッセージを投稿すると、そのサーバーが処理を試み、接続されている他のすべてのユーザーに送信し、履歴ファイルなどにエントリを追加します。
この状況では、80 人のユーザーそれぞれから 10 秒ごとに新しいメッセージをサーバーにポーリングするのは狂気の沙汰なので、永続的な接続の必要性は明らかです。しかし、すべてのリクエストが即座に処理されるわけではないことを考えると、このようなものを実装する最良の方法は何なのかわかりません。