サーバー側の変更を行わずにポーリングを必要としないajaxの代替手段はありますか?

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

質問

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

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

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

役に立ちましたか?

解決

ソリューションは次のとおりです。 WebSync On-Demand などのSaaSコメットプロバイダーを使用します。共有ホスティングの有無にかかわらず、心配する必要のあるサーバーリソースはありません。すべてオフロードされており、必要に応じて情報をプッシュできます。

SaaSであるため、どのサーバー言語でも動作します。 PHPについては、すでに書かれていて準備ができている出版社があります。

他のヒント

彗星は一般にこの種のものに使用されており、特に一般的なテクノロジーではないため、脆弱なセットアップになる可能性があります。とはいえ、2年前に最後に試したときよりも多くのリソースが利用可能です。

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

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

しかし、Comet はそのような目的で設計されています。

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

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

編集:リクエストにタイムアウトを設定することもお勧めします。たとえば、2秒間何も起こらない場合、<!> quot; no change <!> quot;メッセージが返送されます。これにより、クライアントはサーバーがまだ稼働中であり、リクエストを処理していることを認識します。

これは<!>#8220; html5 <!>#8221;とタグ付けされているため、HTML5には <eventsource> および WebSocket ですが、実装側は実際にはまだ未来形です。

Operaは、<event-source>と呼ばれる古いバージョンの<=>を実装しました。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top