2013-04-01 22 views
12

私は、メッセージシステム用にjQueryとPHPを使って長いポーリングを行っています。私はこれを達成するための最高の/最も効率的な方法を知りたいのです。私はこれをオフにしています。Simple Long Polling Exampleです。ロングポーリング - メッセージシステム

ユーザーが受信ボックスのページに座っている場合は、新しいメッセージをプルする必要があります。私が見た1つのアイデアは、last_checked列をメッセージテーブルに追加することです。 PHPスクリプトは、次のようになります

query to check for all null `last_checked` messages 
if there are any... 
while(...) { 
    add data to array 
    update `last_checked` column to current time 
} 
send data back 

私はこのアイデアが好きしかし、私は他の人がそれを考える何を思ったんだけど。これはこれにアプローチする理想的な方法ですか?すべての情報が役立ちます!

追加するには、サイトに設定できる使用回数がないため、効率的な方法を探しています。

+0

これは良い質問です。私は同じことをやろうとしていました。 – samayo

答えて

8

はいこれは、ロングポーリング方法が一般的にどのように動作しているかを示しています。 あなたのサンプルコードは少し曖昧ですので、whileループの中で少しずつを実行し、毎回last_checked(サーバー側に保存されている)とcurrentの時間を比較する必要があることを追加したいと思います(これはクライアント側から送信されるものです)。このような

何か:

$current = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$last_checked = getLastCheckedTime(); //returns the last time db accessed 

while($last_checked <= $current) { 
    usleep(100000); 
    $last_checked = getLastCheckedTime(); 
} 

$response = array(); 
$response['latestData'] = getLatestData() //fetches all the data you want based on time 
$response['timestamp'] = $last_checked; 
echo json_encode($response);  

そして、あなたのクライアント側JSであなたはこの必要があります:

function longPolling(){ 
     $.ajax({ 
      type : 'Get', 
      url : 'data.php?timestamp=' + timestamp, 
      async : true, 
      cache : false, 

      success : function(data) { 
       var jsonData = eval('(' + data + ')'); 
       //do something with the data, eg display them 
       timestamp = jsonData['timestamp']; 
       setTimeout('longPolling()', 1000); 
      }, 
      error : function(XMLHttpRequest, textstatus, error) { 
        alert(error); 
        setTimeout('longPolling()', 15000); 
      }  
     }); 
} 
+0

答えをよろしく! 'getLastCheckedTime'関数は正確に何を含んでいますか?私はあなたがdbがアクセスされた最後の時間を返すと言いましたが、どのように伝えるのでしょうか?データベースの列? – SeanWM

+0

また、if文の最後の4行は表示されませんか? – SeanWM

+0

はい 'getLastCheckedTime();は、新しいメッセージが挿入されたときに自動的に更新されるdbの列の結果を返す必要があります。 最後の4行は、新しいデータがdbに挿入されたときにのみ実行されるため、 'if'ステートメント内にある必要はないので、' while'はそれだけで壊れます。 –

1

ユーザーが1人しかいない場合は、問題ありません。そうしなければ、複雑になるでしょう。また、これを実行することで多くのSELECTクエリを実行します。

私はしばらくの間、PHPとロング・ポーリングは、クライアント間のイベント駆動型の可能性がないため、ネイティブでは機能しないと確信しています。つまり、イベントに頼るのではなく、毎秒/ 2/5秒ごとにデータベースをチェックする必要があります。

しかし、これをやりたければ、ユーザーがメッセージを持っているときはいつでもメッセージングシステムにファイル[nameofuser] .txtを書き込み、このトリガーを使ってメッセージの有無を確認します。ファイルが存在し、空でない場合は、メッセージを取得し、処理し、フィードバックし、テキストファイルを削除する要求を出します。これにより、SQLのオーバーヘッドが削減されます(注意しないと、ディスクのIOが増加します)。

構造的には、結合表がはるかに優れています。ステータスを確認するための新しいテーブルを作成し、3列:user_idmessage_idread_at。使い方は明白でなければなりません。そこにない組み合わせは未読です。

2

last_checkedという新しい列を追加する代わりに、last_checked_timeを追加できます。したがって、last_checked_timeからcurrent_timeにデータを取得することができます。

(i.e) DATA BETWEEN `last_checked_time` AND `current_time` 
1

代わりlast_checkedという名前の列を作成するのではなく、あなたが呼ばれる列作成することができます。確認を。 すべてのメッセージをデータベースに保存すると、データベース内のフィールドを更新できます。例:

  1. ユーザー1はユーザー2にメッセージを送信します。
  2. PHPはロングポーリングシステムを使用してメッセージを受信し、そのメッセージをテーブルに保存します。
  3. オンライン時に、ユーザー1がメッセージを受信する準備ができていることをサーバーに通知します。
  4. サーバーは、チェックされていないすべてのメッセージをテーブルからチェックして返します。
関連する問題