1

私は PHP/MySQL の初心者であり、JavaScript も初めて使用します。あるユーザーが別のユーザーにリアルタイムでリクエストを送信できるページを作成したいと考えています。たとえば、ユーザー A がオンライン ユーザーのリストを表示し、ユーザー B (オンライン) に要求を送信すると、ユーザー B のページにポップアップ アラートが表示され、ユーザー B には [はい] または [いいえ] をクリックするオプションが表示されます。 ユーザー A は、B の応答を含むポップアップを受け取ります (またはタイムアウトした場合は、デフォルトで [いいえ] に設定されます)

これは通常どのように行われますか?私の質問には2つの部分があると思います:

  1. オンライン/オフラインのユーザーを記録する方法は? (ログイン/ログアウト時間を記録するテーブルが必要ですか?)
  2. 通常、2 人のユーザー間でメッセージを送信する方法
4

3 に答える 3

4

何を作ろうとしているのかはわかりませんが、プライベートチャットが良い例だと思いますか? それがあなたがしていることのふりをします。

これを完全なチュートリアルに変えることなく、必要に応じて適切な量の情報を提供しようとします. 物事を読むためのリンクや提案が飛び散ることを期待してください.


アイデア

アプリケーションの核となる 1 つの基本的なアイデア、ユーザー コミュニケーションがあります。HTTP のステートレスな非同期の世界から、ステートフルな同期の世界に何とか移行する必要があります。これを行うにはいくつかの方法があります。

ポーリング

これは、AJAXを使用して、サーバーからの情報を繰り返し要求しています。AJAX はAsynchronous Javascript And XMLの略ですが、XML ビットについては心配する必要はありません。これは単なる歴史的なものです。基本的に、AJAX はブラウザのスクリプトから通常のリクエストを行うようなものです。これにより、更新せずにサーバーからデータを送受信できるという利点が得られます。これは、ユーザーが開始したか、遅延を処理できる状況に適しています。あなたの場合、誰かが最後にアクションを実行した時間をマークし、タイムアウトを指定して、誰かがいつオフラインになるかを決定します。リクエストの結果には、チェック後に到着した可能性のある新しいメッセージが含まれます。

ロングポーリング/コメット

これは、以前のポーリングのアイデアの拡張です。これは、クライアントが開始する基本的な AJAX の性質に対する回避策であることはほぼ明らかです。Comet は基本的には単なる AJAX ですが、接続を長時間開いたままにして、サーバーが情報をプッシュできるようにします。この手法に関する情報は、 Cometで確認できます。ただし、この手法にはいくつかの問題があります。

  • フレークな経験。ブラウザーが異なれば長時間開いている接続の処理も異なるため、すべてのブラウザーですべてのユーザーに一貫したエクスペリエンスを提供することは困難です。
  • 切断します。最終的に断線となります。最終的にブラウザは.abort()リクエストを呼び出し、再度開く必要があります。
  • 単一接続の制限。HTTP/1.1 標準では、ブラウザが一度に開くことができる同時接続は、サーバーごとに 1 つだけであると規定されています。複数の (サブ) ドメインを使用することで、これを回避できます。

通常の使用方法の一部である切断がまだ残っているため、基本的に以前と同じ手法を使用する必要があります。違いは、サーバーが必要な限り接続を開いたままにしておく必要があることです。バックエンドで使用するテクノロジーに応じて、これは些細なことから困難なものまでさまざまであり、慎重に処理しないと、パフォーマンスが大幅に低下する可能性があります。

WebSocket

WebSocketは本質的には以前のソリューションですが、標準化され、適切に実装されています。WebSocket の本質は、サーバーに対して通常のリクエストを行うことができますが、TCP 接続にアップグレードするように依頼することです。ここでのアップグレードという言葉は少し誤解を招きます。技術的には、接続から HTTP のものを削除し、生の基になる接続をそのままにしておくためです。

WebSocket は永続的な接続用に設計されており、全二重 (双方向の通信) です。

ただし、大きな欠点が 2 つあります。これらは新しいものであり、サポートがそれほど普及していないことを意味します。最新のブラウザーのほとんどがサポートしていますが、すべての人が最新のブラウザーを持っているとは限りません。サーバー側のサポートが必要です。これは、リクエストをアップグレードして効率的に処理できるシステムが必要であることを意味します。これは新しいテクノロジーであり、サポートが制限されており、socket.ioが主要なものであるためです。socket.io は node.js モジュールであるため、適切ではない可能性があります。他の言語や技術も出回っていますが、利用できるサポートは明らかに少ないです。

(編集:質問を読み直して、PHPを使用していることを確認しました。このライブラリを使用できます:ウェブソケット用のphp-websocket。テストしたので、emptorに注意してください)

WebSocket を使用すると、接続の切断をオフライン シグナルとして使用でき、必要に応じてデータを送信するだけです。ただし、WebSocket が利用できない場合は、より信頼性の高い古いソリューションにフォールバックすることが賢明であるため、そのことを念頭に置いてください。


これらすべてのソリューションには、まだ解決しなければならない問題が数多くありますが、これにより、どこからどのように開始すればよいかがわかると思います。少なくとも、Google で検索できる (または bing、duckduckgo、ask などの) 多数のフレーズが提供されます。

于 2012-11-09T06:58:05.150 に答える
1

各ユーザーに、新しいメッセージがあるかどうかをサーバーに「ポーリング」(たとえば、ajax呼び出し)させることができます。しかし、私はsocket.ioまたは同様のフレームワークをチェックします。

于 2012-11-09T05:50:46.197 に答える
0

1、誰かがすでにログインしている場合、DBからユーザー名/パスワードまたはパスワードキーを読み取った後にログイン検証を行うため、ユーザーがログインするとDBでマークできるようになりますまた、サーバーでのセッション処理でも

2、これには2つの方法があります。最も高度な方法は、Webソケットを使用してポーリングする必要がないようにすることです。別の方法は、ajax / Cometなどを待機することです

私の説明は、ヘリコプターからあなたの要件を見ているようなものです..上記のものについて読み始めると、さらに詳細が表示されます...

これがあなたの質問に答えてくれることを願っています ありがとう

于 2012-11-09T05:56:07.693 に答える