11

小さくて基本的な「ajax」ベースのマルチプレイヤー ゲームを作成しようとしています。オブジェクトの座標は、PHP の「ハンドラ」によって与えられます。この handler.php ファイルは、ajax を使用して 200MS ごとにポーリングされています。

何も起きないときはポーリングする必要がないので、頻繁にポーリングしなくても同じことができるものはないのだろうか。例えば。Comet ですが、Comet 用にサーバー側アプリケーションを構成する必要があると聞きました。共有ウェブサーバーなので、それはできません。

クライアントで何も変更する必要がない場合、handler.php ファイルが応答を返さないようにすることもできますか? その場合も、何かがまだ変更されていないにもかかわらず、クライアントが無用に応答を要求することになります。基本的に、クライアントに何かを伝える必要がある場合にのみ、帯域幅とサーバーのリソースを使用する必要があります。オブジェクトの座標の変更。

4

6 に答える 6

11

コメットは一般的にこの種の用途に使用されますが、特に一般的なテクノロジーではないため、脆弱なセットアップになる可能性があるため、「正しく理解する」のは簡単ではありません。とはいえ、2 年前に最後に試したときよりも多くのリソースを利用できるようになりました。

あなたが考えていることを実行できず、handler.php に何も返さずに実行を停止させることはできないと思います: Web サーバーは接続を開いたままにし、handler.php が何かを行う (終了または出力を提供する) まで、それ以上のポーリングを防ぎます。 )。その場合、まだ応答を処理しています。

AJAX が非常に長いタイムアウト (たとえば 30 秒) を許可する長いポーリング手法を試すことができます。handler.php は、何か報告するまで応答せずにスピンし、その後戻ります。(回転がリソースを大量に消費しないことを確認する必要があります)。handler.php が「期限切れ」になって何も起こらない場合は、終了して AJAX を再度ポーリングさせます。30 秒ごとにしか発生しないため、1 秒間に最大 5 回の大幅な改善になります。これにより、ポーリングが最小限に抑えられます。

しかし、それはコメットが設計されたものです。

于 2009-01-09T12:28:55.427 に答える
8

Ajax はクライアント サーバー リクエスト モデル (通常はプッシュではなくプルと呼ばれます) のみを提供するため、サーバーからデータを取得する唯一の方法はリクエストを介することです。ただし、これを回避するための一般的な手法は、サーバーが新しいデータがある場合にのみ応答することです。したがって、クライアントがリクエストを行い、サーバーは何かが発生するまでそのリクエストを保留してから応答します。これにより、クライアントが応答を取得した後に新しい要求を送信するだけでよいため、データが変更されていない場合でも頻繁にポーリングする必要がなくなります。

PHP を使用しているため、単純な方法の 1 つは、データ変更のチェックの間に一度に 200 ミリ秒の間、PHP コードでスリープ コマンドを呼び出し、データが変更されたときにクライアントにデータを返すことです。

編集:リクエストにタイムアウトを設定することもお勧めします。したがって、たとえば 2 秒間何も起こらない場合、「変更なし」というメッセージが返されます。こうすることで、クライアントはサーバーがまだ稼働しており、その要求を処理していることを認識します。

于 2009-01-09T12:32:08.900 に答える
5

これは「html5」とタグ付けされているため、HTML5にはWebSocket<eventsource>がありますが、実装側はまだ実際には未来形です。

<eventsource>Operaは呼び出されたの古いバージョンを実装しました<event-source>

于 2009-01-09T14:58:44.767 に答える
4

解決策は次のとおりです。WebSyncOn-DemandなどのSaaSコメットプロバイダーを使用してください。共有ホスティングかどうかに関係なく、サーバーリソースはすべてオフロードされているため、心配する必要はありません。必要に応じて情報をプッシュできます。

SaaSであるため、どのサーバー言語でも機能します。PHPの場合、すでに作成されて準備ができているパブリッシャーがあります。

于 2010-01-11T20:06:49.133 に答える
1

ロング ポーリングの提案に追加する 1 つのこと: 共有サーバーを使用している場合、アクティブなロング ポーリングごとに接続 (およびその接続にサービスを提供するサーバー側プロセス) をアクティブに保つため、このソリューションのスケーラビリティは制限されます。プロバイダーは、一度に開くことができる接続の数に制限 (ポリシー定義または事実上のいずれか) を持っている可能性が高いため、同時に再生するよりも多くのセッション/ウィンドウがある場合、壁にぶつかります。

于 2009-01-09T15:37:51.660 に答える
1

サーバーはこれに参加する必要があります。ホスティング プロバイダーに、利用可能なモジュールを確認してください。または、Comet をサポートするよう説得してみてください。

おそらく、これには小さな仮想プライベート サーバー (VPS) を検討する必要があります。

于 2009-01-09T12:25:33.077 に答える