2012-05-08 38 views
3

友人と私は、WebベースのAJAXチャットソフトウェアをjQueryとPHPコアで構築しています。これまでは、2秒ごとにサーバを呼び出すか、アップデートを探している標準的な手順を使用してきました。しかし、私は高速ではないので、このメソッドを嫌うようになったし、データが返されなくても、サーバーからの往復の要求がたくさんあるという点で "費用対効果"もありません。Ajaxロングポーリングの制限

私たちのプロジェクト支持者の一人は、COMETと呼ばれる手法、具体的にはロングポーリングを検討することを推奨しました。しかし、それについて別の記事やブログ記事で読んだところ、Apacheサーバーで使用すると実用的ではないことがわかりました。大抵の人は「良いアイデアではない」と言っているようですが、Apacheが一度に処理できるリクエストの数にはあまり意味を与えていません。

PureChatの全目的は、偉大に見え、高速になり、ほとんどのサーバーで動作するチャットを人々に提供することです。そのため、ユーザーの約96%がLighttpdやNginxではなく、長いポーリングに適していると思われます。

ポイントへの行き方:あなたの意見では

を、それがのsetIntervalを引き続き使用して繰り返し、新しいデータを要求するために良いですか?または、ほとんどのユーザーがApacheを使用するという事実にもかかわらず、ロングポーリングの方が良いでしょうか?また、Apacheサーバーがロールオーバーして死ぬ前に、チャットを使用できる人の数について、より具体的な説明を得ることは可能ですか?

+2

Tomcat 7にはWebSocketのサポートが追加されているので、ポーリングフォールバックを使用することもできます。 – Andrew

+0

これが小規模なものであれば、それは問題ではありません。 1000人の同時ユーザーを計画している場合は、各接続ごとに新しいスレッドが開かれるため、Apacheは死ぬでしょう。 NginXは単一のスレッド上で動作するので、多くの接続に拡張できます。しかし、PHPを使用している場合、これは多くの場合、あなたの思うようにあなたを助けません。詳細については私の下の答えを参照してください。 – dqhendricks

答えて

2

Andrewは、サーバーとの非同期通信のための究極のソリューションはソケット接続であると述べていますが、現時点では最先端のブラウザでしかWebSocketをサポートしていません。 socket.ioは、ブラウザがサポートしている場合はWebSocket接続を開始するために使用できるオープンソースAPIですが、ブラウザがサポートしていない場合はFlashの代替手段に戻ります。ただし、これはAPIを使用するコーダーには透過的です。

ソケット接続は、基本的にブラウザとサーバー間のオープンな通信を維持するため、各自がいつでもメッセージを互いに送信できるようにします。ソケットサーバデーモンは、接続された加入者のリストを保持し、加入者の1人からメッセージを受信すると、すぐにこのメッセージをすべての加入者に送り返すことができます。

ただし、ソケット接続の場合、サーバーでフルタイムで動作するソケットサーバーデーモンが必要です。これはコマンドラインPHP(Apacheは必要ありません)で行うことができますが、非ブロッキングのサーバーサイドJavaScript APIであるnode.jsに適しています。

node.jsは、あなたが話していること、長いポーリングにも適しています。基本的にnode.jsはイベントドリブンでシングルスレッドです。これは、たくさんのスレッドを開く必要なく、たくさんの接続を開いたままにすることができ、多量のメモリを消費することになります(Apacheの問題)。これにより、高可用性が可能になります。しかし、あなたが念頭に置いておかなければならないのは、Nginxのような非ブロックファイルサーバを使っていたとしても、PHPはネットワークコールをブロックすることが多いということです。これは単一のスレッドで実行されているので、それぞれの(例えば)MySQLコールは、基本的にはそのMySQLコールの応答が返されるまでサーバを停止させます。これが起こっている間に他の何も成し遂げられないので、あなたのノンブロッキングサーバーは役に立たなくなります。しかし、ネットワークコールでJavaScript(node.js)のような非ブロッキング言語を使用した場合、これは問題ではありません。 MySQLからの応答を待つ代わりに、応答が処理可能になったときに応答を処理するハンドラ関数を設定し、待機中にサーバが他の要求を処理できるようにします。

長いポーリングでは、基本的にリクエストを送信します。サーバーは応答する前に50秒待機します。レポートするものがあれば、50秒より早く応答します。それ以外の場合は待機します。50秒後に何も報告されなければ、ブラウザはタイムアウトしないように応答を送信します。応答によってブラウザは別の要求を送信し、プロセスは再び開始されます。これにより、要求と応答がより少なくなりますが、ソケット接続ほど良くはありません。

+0

また、ソケットサーバーデーモンは、通常は共有サーバーでは許可されないサーバーのソケットにアクセスする必要があります。 VPSが必要です。 – dqhendricks

+0

詳細な対応をありがとうございます。大変感謝しています。私が本質的に直面している問題は、チャットをオープンソースソフトウェアとしてリリースしているため、インストールされるサーバーを管理できないということです。その点を考慮して、大多数のユーザーが共有ホスティングになると仮定しなければなりません。したがって、彼らはおそらくソケットへのアクセス権を持っておらず、Node.jsがインストールされていない可能性もあります。ユーザーの制限/上限を設定してロングポーリングを実装する方が良いと思うのですか? –

+0

正直、私はあまりよく分かりません。あなたが言うように、異なるサーバーは、異なる量のメモリを持っています。私はメモリ量を返すPHP関数のための簡単なgoogle検索を行った。私が得たのは、使用されたメモリの量を返す関数でした。 –

関連する問題