少し前に同様の問題に直面しました。サーバーサイドのコメントストレージにmysqlなどを使用していると思いますか?
最初にタイムスタンプ整数列をmysqlテーブルに追加することで問題を解決し、次に新しい行を追加したときにtime()
、現在の時刻を保存するために使用するだけでした。
mysql 行挿入の例:
$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";
ステップ 2 は、サーバーサイドから送信するデータを json_encode することです。
$output = array();
if ($html && $html !== '') { // do we have any script output ?
$output['payload'] = $html; // your current script output would go in this variable
}
$output['time'] = time(); // so we know when did we last check for payload update
$json = json_encode($output, ((int)JSON_NUMERIC_CHECK)); // jsonify the array
echo $json; // send it to the client
したがって、純粋な html の代わりに、サーバーサイド スクリプトは次のようなものを返します。
{
"payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
"time":1354167493
}
JavaScript で簡単にデータを取得できます。
<script type="text/javascript"> // <![CDATA[
var lastcheck;
var content_main = $('#content_main');
pollTimer = setInterval(function() {
updateJson();
}, 10000);
function updateJson() {
var request = '/feed_main.php?timestamp='+ (lastcheck ? lastcheck : 0);
$.ajax({
url: request,
dataType: 'json',
async: false,
cache: false,
success: function(result) {
if (result.payload) { // new data
lastcheck = result.time; // update stored timestamp
content_main.html(result.payload + content_main.html()); // update html element
} else { // no new data, update only timestamp
lastcheck = result.time;
}
}
});
}
// ]]> </script>
これでサーバーとクライアント間の通信がほぼ処理されます。次のようにデータベースにクエリを実行するだけです。
$timestamp = 0;
$where = '';
if (isset($_GET['timestamp'])) {
$timestamp = your_arg_sanitizer($_GET['timestamp']);
}
if ($timestamp) {
$where = ' WHERE timestamp >= '.$timestamp;
}
$query = 'SELECT * FROM comments'. $where .' ORDER BY timestamp DESC;';
タイムスタンプは前後に渡され、クライアントは常に前のクエリでサーバーから返されたタイムスタンプを送信します。
サーバーは、前回チェックした後に送信されたコメントのみを送信し、私が行ったようにそれらを html の末尾に追加できます。(警告: 私はこれにいかなる種類のサニティ コントロールも追加していません。コメントは非常に長くなる可能性があります)
10 秒ごとに新しいデータをポーリングするため、大量のチャンク帯域幅を節約するために、ajax 呼び出しを介して純粋なデータを送信することを検討することをお勧めします (タイムスタンプだけを含む JSON 文字列は、わずか 20 バイト程度です)。
その後、javascript を使用して html を生成できます。これには、サーバーからクライアントに多くの作業をオフロードするという利点もあります :)。また、一度に表示するコメントの数をより細かく制御できます。
かなり大きな仮定をいくつか行ったので、必要に応じてコードを変更する必要があります。あなたが私のコードを使用し、あなたの猫|コンピューター|家がたまたま爆発した場合、あなたはすべてのピースを保持することができます:)