我想尝试使多个浏览器/客户端之间的计时器保持同步,该计时器递减到存储在数据库中的日期.如果日期由于某种原因发生变化,那么我将需要适当地更新计时器.这最终将成为我试图创建的JavaScript游戏的一部分,但在真正继续之前,我需要游戏的核心.
该计时器本质上将是动态的,因为如果需要,时间将需要轻松更改.我想到了通过PHP脚本每秒轮询数据库以进行更改的想法,这也将有助于在浏览器之间同步计时器.但是,这似乎很耗费服务器资源,并且如果可能存在延迟,则实际上可能不会同步计时器.
任何想法都会有所帮助,谢谢.
SQL:
CREATE TABLE timer(
timer_id INT PRIMARY KEY AUTO_INCREMENT,
timer_date DATETIME NOT NULL
);
jQuery的:
$(document).ready(function() {
$('#button').click(function() {
//get timer id
var timerId = $('#button').attr('tid');
//disable button
$('#button').attr('disabled', 'disabled');
//send ajax request
$.ajax({
url: "process.php",
type: "POST",
data: "id="+timerId,
dataType: "json",
success: function(data){
//IF TIMER HAS CHANGED UPDATE ELSE DON'T DO IT
//re-enable button
$('#button').removeAttr("disabled");
}
});
});
解决方法:
您有两个选择,轮询或TCP keepalive.尽管轮询更易于实现,但两种方法都可以工作.
从为游戏客户端提供Web服务的角度考虑这一点.从客户端的角度来看,它并不在乎是否涉及数据库.因此,请记住这一点,设置您的时间戳URL(例如,sync.php),然后在内存中设置诸如memcache之类的内容来存储数据,这样就不会一直造成数据库开销.
我也会认真考虑客户端中的关键路径.您真的需要每秒轮询一次吗?在这种情况下,网络延迟可能只是一个因素.您的客户应具有足够的聪明才智,以了解某些事情是否取决于时间的准确性,您应该对此进行编码.
更新1:
作为对您的代码示例的回应,我建议您考虑使用GET而不是POST进行轮询,因为您实际上并没有更改系统状态,而是尝试从中检索信息(我推断这从您的问题开始,因为代码似乎实际上是在更改系统状态).