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

私はこの考えが好きですが、他の人がそれについてどう思うか疑問に思っています. これはこれにアプローチする理想的な方法ですか?どんな情報でも役に立ちます!

加えて、このサイトには一定数の使用方法がないため、効率的な方法を探しています。

4

4 に答える 4

8

はい、あなたがそれを説明する方法は、ロングポーリングメソッドが一般的にどのように機能しているかです。あなたのサンプルコードは少し曖昧なので、ループsleep()内で短時間実行し、そのたびに時間 (サーバー側に保存されている) と時間 (つまり、クライアント側から送信されます)。whilelast_checkedcurrent

このようなもの:

$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);
          }     
       });
}
于 2013-04-04T08:33:05.613 に答える
2

last_checkedas として追加できるように新しい列を追加する代わりにlast_checked_time。からデータを取得できるようにしlast_checked_timeますcurrent_time

(i.e) DATA BETWEEN  `last_checked_time` AND `current_time`
于 2013-04-01T12:30:13.857 に答える
1

ユーザーが 1 人しかいない場合は、それで問題ありません。そうしないと、複雑な問題が発生します。これを行うと、非常に多くの SELECT クエリも実行されます。

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

ただし、それでもこれを行いたい場合は、ユーザーがメッセージを受信するたびに、メッセージング システムがファイル [nameofuser].txt をディレクトリに書き込み、このトリガーを使用してメッセージの存在を確認するようにします。ファイルが存在し、空でない場合は、リクエストを発行してメッセージを取得し、処理し、フィードバックしてから、テキスト ファイルを削除します。これにより、(注意しないと) ディスク IO が増加する一方で、SQL オーバーヘッドが削減されます。

構造的には、連想テーブルが群を抜いて優れています。ステータスの確認専用の新しいテーブルを作成します。次の 3 つの列がありますuser_id message_id read_at。使用法は明らかであるべきです。そこにない組み合わせは未読です。

于 2013-04-01T12:26:39.440 に答える