Tôi đã gặp vấn đề tương tự cách đây không lâu, tôi cho rằng bạn đang sử dụng mysql hoặc thứ gì đó cho máy chủ lưu trữ nhận xét của bạn?
Tôi đã giải quyết vấn đề của mình bằng cách thêm cột số nguyên dấu thời gian vào bảng mysql của mình, sau đó khi tôi thêm một hàng mới, tôi chỉ cần sử dụng time()
để tiết kiệm thời gian hiện tại.
Ví dụ chèn hàng mysql:
$query = "INSERT INTO comments (name, text, timestamp) VALUES ('". $name ."', '". $text ."',". time() .");";
bước hai sẽ là json_encode dữ liệu bạn gửi từ bên máy chủ:
$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
Vì vậy, bây giờ thay vì html thuần túy, tập lệnh phía máy chủ của bạn trả về một cái gì đó như sau:
{
"payload":"<div class=\"name\">Derpin<\/div><div class=\"msg\">Foo Bar!<\/div>",
"time":1354167493
}
Bạn có thể lấy dữ liệu trong javascript đủ đơn giản:
<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>
điều đó quan tâm khá nhiều đến giao tiếp giữa máy chủ và máy khách, bây giờ bạn chỉ cần truy vấn cơ sở dữ liệu của mình như sau:
$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;';
Các dấu thời gian được chuyển qua lại, máy khách luôn gửi dấu thời gian do máy chủ trả về trong truy vấn trước đó.
Máy chủ của bạn chỉ gửi các nhận xét đã được gửi kể từ khi bạn kiểm tra lần trước và bạn có thể thêm chúng vào cuối html như tôi đã làm. (cảnh báo:tôi chưa thêm bất kỳ loại kiểm soát tỉnh táo nào vào đó, nhận xét của bạn có thể rất dài)
Vì bạn thăm dò dữ liệu mới cứ sau 10 giây, bạn có thể muốn xem xét việc gửi dữ liệu thuần túy qua lệnh gọi ajax để tiết kiệm băng thông chunk đáng kể (chuỗi json chỉ có dấu thời gian trong đó, chỉ khoảng 20 byte).
Sau đó, bạn có thể sử dụng javascript để tạo html, nó cũng có lợi thế là giảm tải rất nhiều công việc từ máy chủ của bạn đến máy khách :). Bạn cũng sẽ có được quyền kiểm soát tốt hơn đối với số lượng nhận xét bạn muốn hiển thị cùng một lúc.
Tôi đã đưa ra một số giả định khá lớn, bạn sẽ phải sửa đổi mã cho phù hợp với nhu cầu của mình. Nếu bạn sử dụng mã của tôi và con mèo | máy tính | ngôi nhà của bạn xảy ra vụ nổ, bạn sẽ phải giữ lại tất cả các mảnh :)