1

jQueryとPHPで「マルチプレイヤーワールド」を構築しています。これがどのように機能するかを少し示します:

  1. ユーザーのキャラクターの位置はデータベースから取得され、それに応じてユーザーがプロットされます (位置の値は CSS 値 - 左と上)

  2. ユーザーはキーボードの矢印キーを使用して移動でき、jQuery アニメーションを使用してキャラクターを動かします。これが発生している間 (矢印を押すたびに)、ユーザーの位置の値がデータベースに挿入され、更新されます。

  3. あなたが言うことができるように、これを「グローバル」にする(ユーザーがお互いを見るようにする)には、AJAXを使用して各ユーザーの値を一度に更新する必要があります

私が抱えている問題は、MySQL サーバーに接続してデータベース テーブルから値を取得する、作成した JavaScript 関数を継続的に呼び出す必要があることです。そして、この関数は常に呼び出す必要がありますがsetInterval(thisFunction, 1000);、サーバーのリソースを過負荷にしたためにホストが一時停止しました。これは、すべての MySQL クエリが原因だと思います。また、データベースから値を繰り返し取得した後でも、数秒ごとに値を挿入する必要があったため、十分な数のクライアントがログインすると、時間の経過とともにクラッシュが発生することが想像できました。使用しているクエリの量を減らすにはどうすればよいですか? 私がする必要があることをする別の方法はありますか?ありがとうございました。

4

6 に答える 6

2

これは、リソースの使用に関するチャット システムと本質的に同じことです。検索してみると、長いポーリングmemcachedなどの概念を含む、さまざまなソリューションが見つかります。たとえば、次のスレッドを確認してください: Scaling a chat app - short polling vs. long polling (AJAX, PHP)

于 2011-04-27T15:53:35.037 に答える
0

別の方法があります。それは、実際のソケットをエミュレートまたは使用することです。常にデータをプルする(新しいレコードがあるかどうかを確認するために更新する)代わりに、現時点でChromeで動作するWebSocketを介してデータをプッシュすることができます(少なくとも私の知る限り、FF4では試していません)。よりスリムで長いプーリングのためのNode.js。そうすれば、プレイヤー間の通信は、位置を保存するためのMySQLを必要とせずに双方向になります。

于 2011-04-27T15:58:43.733 に答える
0

チェックアウトトルネード

彼らのサイトから:

Tornadoは、FriendFeedを強化するスケーラブルなノンブロッキングWebサーバーおよびツールのオープンソースバージョンです。FriendFeedアプリケーションは、web.pyまたはGoogleのwebappに少し似ているWebフレームワークを使用して作成されていますが、基盤となるノンブロッキングインフラストラクチャを利用するための追加のツールと最適化が備わっています。

このフレームワークは、ブロッキングがなく、適度に高速であるため、ほとんどの主流のWebサーバーフレームワーク(および確かにほとんどのPythonフレームワーク)とは異なります。ノンブロッキングでepollを使用しているため、何千もの同時スタンディング接続を処理できます。これは、リアルタイムWebサービスに最適であることを意味します。FriendFeedのリアルタイム機能を処理するために特別にWebサーバーを構築しました。FriendFeedのすべてのアクティブユーザーは、FriendFeedサーバーへのオープン接続を維持します。(数千のクライアントをサポートするためのサーバーのスケーリングの詳細については、C10K問題を参照してください。)

于 2011-04-27T15:59:48.660 に答える
0

長いポーリングを調べる必要があります - http://en.wikipedia.org/wiki/Push_technology。この方法では、サーバーとの接続を確立し、必要な場合にのみ更新できます。ただし、その音によると、毎回更新したい場合はかなり集中的なことが起こっているため、このデータを保存する別の方法を検討する必要があるかもしれませんが、大企業がどのようにそれを行っているのか疑問に思う場合、大量のサーバーを処理する必要がありますが、ロングポーリングに似た手法も使用します。

于 2011-04-27T15:55:26.143 に答える
0

http://php.net/manual/fr/book.memcached.phpmemcachedを参照してすべての位置をメモリに保存し、数秒ごとにデータベースに一度に保存できます (必要な場合)。

于 2011-04-27T15:56:30.007 に答える
0

この問題を解決するには、Web ソケットを使用できます。このnettutsチュートリアルをチェックしてください。

于 2011-04-27T15:57:41.620 に答える