最近、PHPChina が PHP チャット ルーム テクノロジーに関する特別トピックを立ち上げました。私は最近このプロジェクトに取り組んでいます。ここで私の個人的な見解を述べたいと思います。
チャットルームの主な機能:
1. 登録、ログイン、ログアウト、情報変更を行います。
2. ユーザーはチャット ルームの作成を申請し、チャット ルームの属性をカスタマイズします。
3. チャット ルームの名前、説明、モデレーター、お知らせ、広告を表示します。
4. オンライン ユーザーのリストをリアルタイムで表示し、オンライン ユーザー情報 (ニックネーム、電子メール、IP、オンライン時間など) を確認できます。
5. チャットの内容、フォント属性、アクション、表現、一般的なフレーズを投稿します。
6. 非表示、プライベート チャット、スクロール、ユーザーのブロック、画面のクリア、チャット シーンの選択、BGM、および送信方法のカスタマイズが可能です。
7. 管理者はメンバーを管理する権利(メンバーの追い出し、発言禁止、管理権限の譲渡)を有します。
注意すべき点:
1. フレーム構造の使用は禁止されています(iframe は作業負荷を軽減する以外のメリットはありません)
2. フロントエンドコードとバックグラウンドコードは完全に分離されており、データはajaxチャネルを通じてのみ送信され、必要なデータのみが送信される必要があります。 (フォアグラウンドでデータを表示し、バックグラウンドでデータを処理します)
3. プログラムによるページ全体の更新は禁止し、変更が必要な内容のみを更新します(ヘッダーやメタを使用してページを更新することは禁止します)。
4. チャット コンテンツを送信する場合、ユーザー エクスペリエンスの速度を盲目的に追求したり、実際のチャット レコードの送信順序を無視したりすることはできません。 (つまり、多くの人が同時に情報を送信する可能性があるため、送信されたチャット記録はサーバー上で実際の順序に再編成されてからクライアントに送信される必要があります)
使用されているテクノロジー:
1. フロントエンドとバックエンド間のブリッジ - AJAX。 jQuery、XAJAXを選択できます。私は、高速、シンプル、耐久性があり、多くのプラグインがあり、すぐに更新される jquery を好みます。
2. データキャリア XML の形式。実際、一般的なチャット ルーム データはそれほど複雑ではなく、json で十分です。
3. データベース抽象化レイヤー - ADODB。 PDO を使用した方が速いです。 ADODB の使用にはすでに慣れています。
4. 基盤となるデータ ストレージ メディア - MySQL。これについては疑いの余地がありません。
5. データ中間記憶媒体 - memcache。高速読み取りおよび書き込みデータを memcache 共有メモリに保存して、データベースの負荷を軽減します。
6. ビデオと音声を実装する場合は、サーバー FMS (フラッシュ メディア サーバー) のサポートが必要で、クライアントにはフラッシュ プレーヤーをインストールする必要があります。また、HTML、JavaScript、フラッシュ、バックグラウンド間のデータのやり取りも含まれます。これについてはあまり情報がありません。
これらは核となる技術であり、実際のアプリケーション開発においては、まだまだ解決すべき細かい課題が多くあります。
例: オンライン リストの更新をどのように処理するか?
次の 2 つの方法があります。
1. リスト全体を更新します (更新があるかどうかに関係なく)。
2. オンラインメンバーの新規追加、オフラインメンバーの削除、情報が変更されたメンバーの変更を行います。
明らかに 2 番目のオプションが最良のオプションです。
XmlHttpRequest の同時実行性の問題にどう対処するか?
JavaScript はシングルスレッドです。同時に 2 つの XmlHttpRequest オブジェクトがある場合、XmlHttpRequest の生成と終了を制御する必要がある問題が発生しやすくなります。
チャット ルームで更新する必要があるデータは主に、オンライン リスト (メンバー情報の更新を含む)、チャット記録、チャット ルーム属性などです。これらの更新の頻度は一貫していません (時間が一貫している場合は、それを処理する XmlHttpRequest を作成するだけで済みます)。チャット履歴の更新には時間がかかりますが、オンライン リストの更新には少し時間がかかる場合があります。フレームワークを使用せずに XmlHttpRequest オブジェクトを個別に作成すると、同時実行の問題が発生する可能性があります。これには、時間とプロセスの制御関数を作成する必要があります。
setInterval('process_control()',3000) //3 秒ごとに呼び出されます
process_control関数は、タスクを一定間隔で実行し、タスクが完了してから次のタスクを実行するといったタスクのスケジューリングを実現します。