6

jquery と PHP を使用してサイトにチャット機能を追加しましたが、おおむねうまくいっているようですが、スケーラビリティが心配です。誰かアドバイスをいただけないでしょうか。私にとって重要な領域は、誰がオンラインであるかという意識を効率的に管理することだと思います.

詳細: 私は (まだ) ロング ポーリングを実装しておらず、PHP (Apache) で長時間実行されているプロセスの生の数が制御不能になるのではないかと心配しています。

私のコードは、定期的な jquery ajax ポーリング (4 秒) を実行します。これは、最初にデータベースを更新して、アクティブであることを示し、タイムスタンプを設定します。次に、すべてのアクティブなユーザーのタイムスタンプをチェックし、外部 (10 分) のユーザーを非アクティブに設定するルーチンがあります。これまでの私の調査では、これはごく普通のことです。ただし、すべてのアクティブなユーザーが他のすべてのアクティブなユーザーをチェックできるようにしてから、全員がデータベースを更新して非アクティブなユーザーをキックオフすると、労力が重複し、ロックが記録され、サーバーに不要な負荷がかかることに同意します。

そこで、「スイーパー」の役割のアイデアを実装しました。これは、クリーンアップを行う人の役割を継承するオンライン ユーザーの 1 人にすぎません。他のすべての人は、「スイーパー」が存在するかどうかを確認し (DB 読み取り)、続行します。チェック時にスイーパーがない場合は、自分自身をスイーパーにします (DB は自分のレコードに書き込みます)。複数ある場合は、自分自身を「非スイーパー」にして、ランダムな期間スリープさせてから、もう一度確認してください。

私の理論では、この方法では、関連するテーブルの複数のレコードに定期的に更新を書き込むユーザーは 1 人だけで、他のすべてのユーザーは自分のレコードを読み取るか、単に書き込むだけです。したがって、問題なく動作しますが、問題はおそらく、プロセスにいくつかの DB 読み取りが必要であり、実際には、他の調査のように全員にクリーンアップを行わせるよりも効率が悪い可能性があることです。

これまでのところ、100 人を超える同時ユーザーが正常に実行されていますが、クライアントは数百、さらには 1,000 を超えてスケ​​ールアップすることを望んでおり、この段階でこのアイデアが良いかどうかはわかりません。

これが良いアプローチかどうか、何百人ものアクティブ ユーザーに拡張できるかどうか、または別のアプローチを推奨できるかどうかを知っている人はいますか?

余談ですが、実際のチャット メッセージのロング ポーリング/コメットは単純に思えます。コードの適切なリソースを見つけましたが、特に PHP と Apache では危険であると示唆するブログ コメントがいくつかあります。アクティブなスレッドなど。usleep と session_write_close で影響を最小限に抑えます。

繰り返しになりますが、何百人ものアクティブ ユーザーに対して PHP ロング ポーリングを設定した実際の経験がある人はいますか? これをnode.js(経験なし)に移行することを本当に検討する必要がありますか?

前もって感謝します

トニー

4

3 に答える 3

3

私のアドバイスは、専門家でなくても、流星フレームワークでこれを行うことです。これは、専門家でなくても、iframe を介してそのようなチャットを PHP Web サイトにロードするだけです。

スケーラブルで、多くのリソースを消費せず、将来的にはさらに良くなると思います。

そして、PHP コメット ソリューションと jquery および ajax タイムアウト ベースのサーバー呼び出しの両方に確実に勝っています。

微調整が必​​要なだけの完成したソリューションを github で見つけることができるとさえ信じています。

もちろん、実装する前にドキュメントを読んでください。

セキュリティの問題が心配な場合は、meteor のセキュリティをお読みください

于 2012-11-19T12:56:13.757 に答える
2

ロング ポーリングは、実際、PHP にとってかなり悲惨なものです。PHP は常に限られた同時プロセスで実行され、各リクエストをできるだけ迅速に処理するように最適化する限り、大きく拡張されます。長いポーリングや同様のソリューションでは、パイプがすぐにいっぱいになります。

現在出回っているツールでは、PHP はこの種のものに適したテクノロジではないと主張することもできます。PHP の使用を主張する場合は、NodeJS の構築方法と非常によく似た PHP のフレームワークであるReactPHPを試すことができます。React の意味するところは、apache などの Web サーバー内ではなく、別のデーモンとして実行されることが期待されるということです。これの安定性とスケーリングの経験がないため、自分でテストする必要があります。

JavaScript をよく知っていれば、NodeJS を理解するのは難しくありません。NodeJS + socket.ioを使用すると、WebSocket を使用してチャット サーバーとクライアントを簡単に作成できます。これが私の推奨事項です。私がこれを始めたとき、私は数時間以内に何か素晴らしいものを稼働させました.

于 2012-11-19T16:12:03.323 に答える
2

PHP を使用してアプリケーション スタックを維持したい場合、チャット アプリケーションを実際の Web アプリ (iframe ではなく) で実行する必要があり、リアルタイム インフラストラクチャのスケーリングに懸念がある場合は、リアルタイム アップデート用のホステッド サービスを検討することをお勧めします。 、私が働いているプッシャーなど。このように、ホステッド サービスがリアルタイム インフラストラクチャのスケーリングを処理し、アプリケーション機能の構築に専念できるようにします。

この方法では、チャット メッセージ リクエストを処理するだけで済み、コンテンツをサニタイズ/検証してから、Pusher を介して数千の接続されたクライアントに情報をプッシュします。

クイック スタート ガイドは、http: //pusher.com/docs/quickstartから入手できます。

私のリアルタイム Web テクニカル ガイドに、ホストされているサービスの完全なリストがあります。

于 2012-11-20T10:25:25.663 に答える