0

今のところ、私のjavascriptチャットのセットアップは機能しているので、次のようになります

function getNewMessage()
{
     //code would go here to get new messages
     getNewMessages();
}
getNewMessages();

そして、関数内で、JQueryを使用してget postを作成し、phpスクリプトからメッセージを取得します。1。SQL接続を開始します。2。SQLを介して正当なユーザーであることを確認します。3。最後のユーザー訪問以降の新しいメッセージのみを取得します。4 .SQLを閉じる

これはうまく機能し、チャットは完璧に機能します。私の懸念は、これが多くのSQL接続を開いたり閉じたりすることです。非常に高速ですが、今すぐ小さなjavascriptマルチプレイヤーゲームを作成し、ユーザー座標と他の数十の変数を1秒間に3回転送して、毎回SQL接続を開いたり閉じたりして情報を取得したいと思います。毎回多数のテーブルから取得することは、スムーズに実行するには十分に効率的ではない可能性があり、サーバーにも過度の負担がかかる可能性があります。

サーバー/データベースでそれほど難しくないことを知っておく必要がある、これらすべての変数を通信するためのより効率的な方法はありますか?

4

5 に答える 5

2

それがあなたに利用可能な唯一の解決策でない限り、持続的接続を使用しないでください!

MySQLが接続がドロップされたことを検出すると、一時テーブルがドロップされ、アクティブなトランザクションがロールバックされ、ロックされたテーブルのロックが解除されます。持続的接続は、スクリプトがクラッシュした場合でも、スクリプトが終了したときではなく、Apacheの子が終了したときにのみドロップします。トランザクションの途中で接続を継承できます。さらに悪いことに、他のリクエストがブロックされ、それらのテーブルのロックが解除されるのを待つ可能性があります。これにはかなりの時間がかかる場合があります。

接続にかかる時間を測定し、スクリプトの実行時間の非常に大きな割合であると特定した場合を除いて、持続的接続の使用を検討するべきではありません。実際、パフォーマンスが心配な場合は、ここでそれを行う必要があります。xhprofまたはxdebugを確認し、コードのプロファイルを作成してから、最適化を開始します。

于 2010-07-21T01:52:00.953 に答える
0

たぶん、サーバーから新しいメッセージを取得するために別のアプローチを使用してみてください:Comet

この手法を使用すると、それほど多くの新しい接続を開く必要はありません。

于 2010-07-21T00:57:32.307 に答える
0

効率的なSQLステートメントがあれば、同時に数十人のプレーヤーがデータベースを傷つけたり、目立った遅延を引き起こしたりすることはありません。データベースは、ゲームやサイトと同じサーバーまたは少なくとも同じネットワークでホストされる可能性が高いため、心配する必要はありません。あなたのDBがMSDOSを搭載した8ビット16mzボードを実行している別のサーバーでホストされていて、リモートのAmazonにあり、酔っ払った猿が操作するクランク式発電機に接続された電波で接続されている場合は、これであなた自身。

それ以外の場合は、実際には、プレーヤーとの間でやり取りするデータの正確な量についてもっと心配する必要があります。全世界のすべてのオブジェクトの座標をやり取りする場合、DBクエリに数分の1秒かかる場合でも、ページの読み込みに非常に長い時間がかかる可能性があります。これは、ゲームでは「戦場の霧」機能によって克服されることがあります。この機能は、マップ全体のすべてのオブジェクトをユーザーに通知するのではなく、プレーヤーのすぐ近くにあるオブジェクトのみを通知します。これは、オブジェクトの座標がプレーヤーの近くにある単一のSQLクエリで簡単に実行できます。ただし、けちなホストがいる場合は、接続とクエリの数を気にします。

それよりもさらに多くのプレーヤーを引き付けることを懸念している場合は、、、などを使用して、一般的にフェッチされるレコードまたは値を格納する短いファイルを事前に構築するなどのキャッシュ方法を検討することを検討してfopen()ください。ページの読み込みに読み込みます。 または同様に動作しますが、接続できる別のサーバーのように動作し、他のページヒットと共有できる値を格納し、クエリを実行します。fgets()fclose()apcmemcachememcached

キャッシュされたページまたは値が古くなる可能性があると思われる場合に更新するには、cronジョブを頻繁に実行して、これらのファイルまたは値を更新します。ホストがcronジョブを許可していない場合は、ゲストにその作業を行わせることを検討してください。特定のページのスクリプト行は、特定のページヒット数の後にデータベースクエリからの新しい値でキャッシュを更新します。または、ページヒットごとにチェックする日付値をキャッシュし、時間が経過した場合はキャッシュを更新します。

繰り返しになりますが、けちなホストの圧倒的な親指の下にいる場合、または一度に100以上のページヒットを取得している場合を除いて、データベースについて心配する必要はありません。データベースはそれほど壊れやすいものではありません。複数のクエリが発生したときに、ヒステリックな涙を流して墜落した場合、それを作成したエンジニアは長い間仕事をしていません。

于 2010-07-21T05:34:25.127 に答える
0

これは非常に厄介な「答え」であることを私は知っていますが、おそらくこれを別の方法で考える必要があります。結局のところ、これはリレーショナルデータベースの最も強力な使用法ではありません。XMPPソリューションを検討しましたか?IMOはこれが仕事に最適なツールであり、ejabberdとopenfireの両方を最近設定するのは簡単です。優れたStropheライブラリを使用すると、フロントエンドストーリーを簡単に作成できます。また、追加のボーナスとして、HTTPバインディング(commetなど)を取得できるため、サーバーをポーリングする必要がなく、レイテンシーが低下し、生成されるHTTPトラフィックが少なくなります。 。

私が言ったように、アプローチ全体を変更する可能性は非常に低いと思いますが、別の視点を提供したいと思いました。

http://www.ejabberd.im/ http://code.stanziq.com/strophe/

于 2010-07-21T10:14:59.100 に答える