2012-02-08 6 views
0

MySQL、PHP、Ajaxベースのパーソナルメッセージングシステムを構築しようとしています。 msghistory、そのPHP、MySQL、Ajaxベースのパーソナルメッセージングシステム

enter image description here

、ユーザーの最後のメッセージのチェック日付レコードの別の1のように見える - - chkdate

は、すべてのメッセージに対して1つのテーブルがあります。

システムは、このように動作します:ページへのユーザーの兆候は、ページがAjaxの自動チェックを発射

。 Ajaxは10秒ごとにPHPを呼び出します。 PHP側は、ユーザIDによる新しいメッセージをチェックします。最初のチェックでchkdateを確認した後、msghistoryをチェックしてください:最後のチェックデート後にメッセージがない場合、システムはユーザーに通知しません。私は上記の方法で説明された最適なのだろうか?もしそうでなければ、これについてどう思いますか、どちらの方が良いですか?事前

Thxを

+0

いいえ、それは間違いありません。 –

+1

より深刻な注記:長いポーリングを見るべきです - ユーザーカウントが上昇すると、10秒ごとに短いポーリングが行われます。 –

+0

@EugenRieckだから、あなたは何が良い方法ですか? –

答えて

1

ロングポーリングは良いアイデアです。ここではどのように動作するのですか(使用する時間の長さは変わりますが)。あなたのPHPスクリプト(クライアントが要求するもの)に、データベース内の新しいメッセージをチェックする(半)無限ループを実行させます。メッセージが見つからない場合は、sleep()関数を使用して10秒間待ってから、ループが再び通過します。メッセージが見つかると、それをクライアントに送り、ループから抜け出す。クライアントはメッセージを表示してから、10秒後に「長いポーリング」PHPスクリプトに対する新しい要求を開始することができます。

ここにデモPHPスクリプトがあります。 $ username = $ _ GET ["username"];近い将来

<?php 
while(1) { 
    $messages=mysql_query("SELECT * FROM `msghistory` WHERE `to_id`='$username'"); 
    if (!mysql_num_rows($messages) === 0) { 
     //do whatever message processing and printout you need to do here 
     break;//break out of the loop. the script terminates and returns its messages to the client 
    } 
} 
?> 

、私たちは、クライアントとサーバーの間でリアルタイム、プッシュプル通信を可能にWebSocketを、の実装を見に行くされています。しかし、多くの場合、この技術はまだ使用可能ではありません。それまでは、長いポーリングが必要です。

+2

あなたのhttpサーバーが次のように設計されていない限り、これを行わないでください。同時にたくさんの接続を処理します。例えば、Apacheは、デフォルトでは、ほんの一握りのスレッドを生成するように設定されています。最初の数人のユーザーがあなたのウェブサイトに接続した後の意味は、到達不能になります。 –

+0

私はケインのメモを2番目にしています。 Apacheは数百の永続的な接続よりも数万の短い有限の接続をより良く扱うことができます。あなたが行く方向(long-polling vs ajax)にかかわらず、チャット専用のより軽いウェブサーバを設定することを考えてみてください... LighttpdやNginxのように、max_clients数が多いか、同じメモリ/ CPU条件が与えられている。 –