2011-01-16 19 views
1

私はPHP/MySQLでajax tic tac toeゲームを構築しています。 ゲームの前提は、あなたの友人とmygame.com/123のようなURLを共有でき、複数の同時ゲームをプレイできることです。PHP、MySQL、Memcache/Ajaxスケーリング問題

私が設定したのは、ユーザーがゲームボードのスペースを見ている間に、ファイル(reload.php)が3秒ごとに呼び出されているということです。このreload.phpはゲームボードを構築し、出力(html)は現在のゲームボードを置き換えます(つまり、自分のターンのゲームを表示します)。

最初はPHP/MySQLで完全に構築してキャッシュをゼロにしました。ある友人が私にmemcache(移動とIDマッチアップの保存)を介してすべての一時的な/クイックリード情報を試してから、この情報からゲームボードを構築するよう提案しました。

私の問題は、おおよそ30-40人のアクティブユーザーが約40-50のゲームを実行しているときに、両方のソリューションが壁に遭遇することです。

2ノードでVPS.netからVPSで実行されています。 (専用CPU:1.2GHz、RAM:752MB)

reload.phpの各呼び出しは、3つのselectクエリと2つのinsertクエリを呼び出します。引っ張られるデータのサイズはごくわずかです。最初の訪問のために、同じアクションがindex.php上でボードを構築するために起こります。

今裏話が行われていることを、私の質問は:

各ユーザーが自分のgameboardsを再構築するために3秒ごとに同じファイルをポーリングで、すべてのユーザーがインデックスの上に座っているということを、ボトルネックであるだろう。 PHPのAJAX呼び出しはHTML内で行われます。

もしそうなら、ゲームボードを構築するために指定されたファイルセット(reload1.php 2,3など)にユーザーの呼び出しを広め、適切なファイルにユーザーを誘導することが可能ですか?これは圧力を和らげますか?

長い説明があります。しかし、私は他に質問する必要はありませんでした。

ありがとうございました。

+0

これはなぜデータベースに格納されているのですか?なぜmemcachedを使用しないのですか? –

答えて

1

アクティブなゲーム情報を共有するためにソケットサーバーを使用するPHP & MySQLは実際にアクティブなゲームセッションを維持するために使用されるべきではありません。

ソケットサーバーのopensourceの例はred5です。ちょっとお金を払わなくてもSmartfoxをお勧めします。

クライアント間の基本的な通信にのみ使用している場合は、独自のソケットサーバーを設定することも難しくありません。

+0

だから、まったく別の解決法に移行するのではなく、壁の周りには何も言いませんか? –

+0

どのような解決方法を選択していても、スケーリングを開始するときには常に「壁」に陥るでしょう。おそらくあなたのアプリサーバーのパフォーマンスを向上させるためにいくつかの改善を加えることができますが、あなたが与えたことに基づいて、私は実際にあなたにそれに関する勧告を与えることはできません。ポイントは、あなたの現在の設定では、あなたはあなたの "壁"にソケットサーバーと比べて速く走っているということです。 – Naatan

+0

Jeffのソリューションには依然としていくつかのタイプの永続性が必要です。最初はまだゲームをロードしていましたが、@Naatanがソケットサーバーのセットアップを使って提案したように、ゲームをロードします。ソケットサーバーのチュートリアル:[http://devzone.zend.com/article/1086]。 –

-1

各ゲームはそれぞれ独自のファイルを取得します。 459675.html、.txt、.json、またはw/e このファイルは、HTMLページ、またはゲームの現在の状態を伝えるために必要なものであれば何でも構いません。

クライアントは、Webサーバーに最新バージョンのファイルをポーリングします。ウェブサーバーは良い小さなWebサーバーのように機能し、要求を処理するためにスクリプト言語の迷惑メールを行う必要がないため、このファイルをディスクから非常に効率的に配信します。

クライアントが移動すると、要求をスクリプトに送信します。スクリプトはファイルを...リピートします。

あなたのウェブサーバーは、おそらく既に静的ファイル用に最後に変更されたヘッダーを送信するように設定されています。クライアント(ブラウザ)は、最後に変更されたヘッダーが与えられたときに条件付きhttp要求を行う方法をすでに知っています。だから、少しの作業でボーナス効率を上げることができます。