Jag har stött på liknande problem för inte så länge sedan, jag antar att du använder mysql eller något för dina kommentarers lagringsserversida?
Jag löste mitt problem genom att först lägga till heltalskolumn för tidsstämpel i min mysql-tabell, och sedan när jag lade till en ny rad skulle jag helt enkelt använda time()
för att spara aktuell tid.
mysql rad infoga exempel:
$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";
steg två skulle vara att json_encode data du skickar från serversidan:
$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
Så nu, istället för ren html, returnerar ditt serversideskript något så här:
{
"payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
"time":1354167493
}
Du kan ta tag i data i javascript helt enkelt:
<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>
som i stort sett tar hand om kommunikationen mellan server och klient, nu frågar du bara din databas ungefär så här:
$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;';
Tidsstämplarna skickas fram och tillbaka, klienten skickar alltid tidsstämpeln som returnerades av servern i föregående fråga.
Din server skickar bara kommentarer som skickats sedan du kollade förra gången, och du kan lägga till dem i slutet av HTML-koden som jag gjorde. (varning:jag har inte lagt till någon form av förnuftskontroll till det, dina kommentarer kan bli extremt långa)
Eftersom du efterfrågar ny data var tionde sekund kanske du vill överväga att skicka ren data över ajax-anropet för att spara avsevärd bandbredd (json-strängen med bara tidsstämpel i den är bara cirka 20 byte).
Du kan sedan använda javascript för att generera html, det har också fördelen att avlasta mycket av arbetet från din server till klienten :). Du kommer också att få mycket bättre kontroll över hur många kommentarer du vill visa samtidigt.
Jag har gjort några ganska stora antaganden, du måste ändra koden för att passa dina behov. Om du använder min kod, och ditt katt|dator|hus råkar explodera, får du behålla alla bitarna :)