XAJAX と PHP を使用してリアルタイム チャットを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/965890

  •  12-09-2019
  •  | 
  •  

質問

XAJAX と PHP を使用してリアルタイム チャットを作成するにはどうすればよいですか?

言い換えれば、サーバーから複数のクライアントに xajax 応答を送信する方法はありますか?それとも、クライアント側で数秒ごとに新しいメッセージをチェックする唯一の方法でしょうか?

役に立ちましたか?

解決

いいえ。クライアントはサーバーを繰り返し「ポーリング」する必要があります。

ここで重要なのは、インタラクションデザインを考えることだと思います。トリックは、チャットが即時であるとユーザーに思わせることですが、実際には 1、2、3、または 10 秒に 1 回更新されます。

アイデア:

1) ユーザーがメッセージを送信すると、それをチャットに直接表示し、投票をトリガーします。

2) アンケートに他のユーザーから複数のメッセージが返された場合は、すべてを一度に追加せず、ランダムな間隔で 1 ~ 2 秒程度かけて追加し、メッセージが届いているように見せます。 「瞬時に」そして独立して。(一度に大量のメッセージが届いた場合、ユーザーはチャットが継続的ではなくその場で更新されたことにすぐに気づきます。)

3) ユーザーが x 時間アイドル状態だった場合。ポーリング レートを 10 秒に 1 回程度に下げます。

4) ユーザーがアクティブな場合、つまり大量のメッセージを送信している場合は、より頻繁にポーリングします。

5) チャットの最終更新時刻を書き込むチャネルごとに静的ファイルを用意します。たとえばファイル chat-teenfun-lastupdate.txt 内容があります 1224934239 または好みの時刻形式でも構いません。このファイルを静的に提供し、クライアントが呼び出しを行うのではなく、チャネルが更新されたかどうかを確認するためにこのファイルをポーリングできるようにします。 chat-poll.php?ch=teenfun それは動的チェックを行います。静的ファイルは、動的スクリプトに必要な作業に応じて約 10 ~ 100 倍の速度で提供され、250 人以上のユーザーがポーリングする場合に必要になります。

頑張って楽しんでね!

/0

PS. あるいは、実際にクライアントにサーバーへの ajax 呼び出しを実行させ、クライアントを「ハング」状態に保つこともできます。 つまり、要求を受け入れてデータの返送を開始するふりをしますが、その後はただ停止するだけです。何かが発生すると、適切なデータを使用して応答を終了します。これを機能させるには、独自の HTTP サーバーを作成する必要があると思いますが、メモリ内に 250 個の PHP プロセスを滞留させることはできないため、これを具体的に実行します。おそらく Lighttpd は、LUA キャッシュ MOD を使ってこのように使用できるかもしれません。わからない。でも面白いでしょうね。地獄、いつか試してみる必要があります:)

他のヒント

確かにそれはありますが、ユーザーが多い場合にはあまり効率的ではないと思います。各クライアントがサーバーをポーリングして新しいメッセージがあるかどうかを確認するポーリングを実行することも、 コメットテクニック サーバーが新しいメッセージをクライアントにプッシュできる - を確認してください。 XAJAX 用 Comet プラグイン. 。XAJAX と PHP を使用してこれをどのように実装するかは私にはわかりませんが、実装してみる方法は次のとおりです。

各クライアントがサーバーに接続できるようにして (ログインなど)、次のようにします。

  1. クライアント (送信者) によって送信されたメッセージごとに、クライアント (受信者) のメッセージ キューを更新します。
  2. クライアントがキュー内の新しいメッセージをサーバーにポーリングするか、comet 経由で新しいメッセージをプッシュします。
  3. 新しいメッセージがある場合は GUI を更新します。
  4. 洗い流す、泡立てる、を繰り返す

ejabberd のような真の IM サーバーを使用すると、はるかに効果があり、効率が向上し、ユーザーがデスクトップ クライアント経由で接続できるようになります (それが必要な場合)。おそらくそれをバックエンドとして使用し、IOW ejabberd がサーバーとなり、PHP がクライアントになります。 PHP の XMPP, 、WebGUI のプロキシとして機能します。

以下も参照してください。
Gmail のチャット機能に関する Google Techtalk (およびスケーラビリティの問題)

それが私の0.02ドルです

HTTP プッシュ技術がない限り、これだけを使用してリアルタイム チャットを取得することはできません。 JavaScript.

考えられる回避策:

  • 使う Flash 映画とか Java ソケット通信を実行するアプレット
  • ポーリングリクエストをサーバー側で数秒間保留します

あなたはWebSocketをを使用することができますが、新しいHTML5の特徴である、それはちょっと限られます。あなたのためのラッキー socksjs には、それを処理していないブラウザでのWebSocketを実装する、があります。

あなたがどんなのWebSocketサーバーを使用することができるはずホスティング側では、PHPのためのいくつかあります。

あなたは、このようなPHP / JSPなどのスクリプト言語で書かれたチャットサーバを実装するために探している場合は、

、HTTP接続をぶら下げの技術があなたのあなたのオプションリストからムッする必要があります。その理由は、ウェブ切断(特別共有ホスト)のほとんどがぶら下がってあまりにも多くの接続は好きではないです。

あなたはこの中で、WebクライアントとPHPチャットサーバを実装するために必要なすべて<のhref = "http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5578709&url=http%3Aを見つけることができます%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D5578709" REL = "nofollowを"> "サーバサイドスクリプト言語用のチャットサーバープロトコル" 出版する。最適化

私が見た中で最高の戦略は、メッセージのためのAJAX要求を行い、その後、すぐにそれが終わるとそのまったく同じ要求を再起動することです。

サーバー側では、60秒間、または新しいメッセージが受信されるまでスクリプト「ストール」を作ります。これは、60秒の最大のオープン同じ接続を保持しますが、新しいメッセージを受信したとき、それは別の接続を開くために、クライアント側のAJAXを促す、それを出力し、すぐに停止します。

これは、新しいメッセージのほぼ瞬時に通知を提供し、また、新しい接続ごとにx秒を作るよりも、サーバー上の方がはるかに簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top