如何在PHP中使用数据库制作倒计时计时器


How to make countdown timer using database in PHP?

我是JavaScript新手。我目前正在做一个考试申请与倒计时计时器。我已经使用JavaScript定时器与cookie,但问题是,当计算机关闭cookie丢失,因为计算机被冻结的深度冻结。

我的问题是如何使倒计时定时器使用数据库?以及如何使它暂停定时器时浏览器关闭,然后恢复定时器时浏览器重新打开?

在不了解您的任何细节(数据库类型,接口等)的情况下,我只能提出一些一般性的建议:

  1. 将cookie保存为文件(使用PHP的fopen, fwrite等)
  2. 将cookie的值保存为数据库值(可以是任何表,任何列,最可能是日期/时间类型)

我要做的是在setInterval内使用ajax,比如每10秒,然后在数据库中存储一个值作为最大时间(以秒为单位)。

每次ajax调用(jQuery.post())时,您都有一个服务器端脚本,该脚本将通过间隔中的超时设置减少数据库中的时间,因此,作为一个快速示例。

你开始用360秒(10分钟),然后你的javascript间隔调用ajax每10秒你减少数据库中的值10秒,每当服务器端代码运行。

我做了一些类似于记录输入数据所花费的时间的事情。

这样,只要页面是打开的,并且javascript代码运行,它就会继续倒计时,您可以返回剩余时间,当它小于0时提示某种消息。如果他们离开了一段时间,或者电脑"冻结"了,当页面再次加载时,它会从离开的地方重新开始。

我看到的唯一真正的问题是你会得到所谓的竞争条件,除非你有一种方法来识别每个用户并给他们各自的计时器。想象一下,我有两个用户用户A和用户B,如果只有用户A访问这个页面,一切都没问题。但是,如果A和B同时使用该页面,它们将各自减少10秒的时间,共计20秒,对于各自的ajax请求的每次调用。

你可以使用一些基本的用户登录设置。当他们返回时,他们会输入用户名,这样你就可以给他们分配正确的计时器

一般来说,创建这样一个计时器的最佳方法是不存储剩余的秒数,而只存储计时器启动的时间。然后你可以用简单的数学计算出剩余的时间。

在你的javascript所在的PHP页面上,你应该有一些PHP代码,在页面加载时为用户创建某种形式的入口。这可以是一个文本文件,一个MySQL条目,或者是PHP会话中的一些东西,如果PHP会话生命周期对你的用例来说足够好的话。在该条目中存储了计时器首次启动时服务器的系统时间,例如使用PHP的time()。如果条目已经存在,那么当然应该保留一个条目,这样用户就可以刷新页面,而不会意外地重置计时器。这个页面还应该给你的javascript一个包含剩余时间的变量。

然后你有第二个PHP脚本,你可以调用你的javascript(使用HTTP请求),返回定时器$timer_max - (time() - $stored_time)上留下的时间,然后你可以让你的javascript检查计时器每隔这么多秒,并简单地插入时间在你的客户端,所以它看起来像计时器是主动倒计时到你的用户。

基于开始时间的方法的优点是它更准确,而每10秒倒数一次的方法可能会随着时间的推移而变得不准确,因为javascript的超时函数对其时间并不是那么严格。它也非常有用的东西,如PHP不运行恒定的更新循环,而只是运行一个脚本,每当它从web服务器请求。

编辑(我错过了暂停计时器的部分,我的错):对于暂停计时器,这种方法可能不是那么完美,但是可以简单地引入另一个PHP脚本来暂停计时器,将计时器暂停时的服务器时间存储在条目中,以及计时器启动时的时间,然后当用户返回$stored_time时可以设置为time() - ($pause_time - $stored_time),其中$paused_time是计时器暂停时的时间。

让服务器检测浏览器关闭时可以通过让用户在关闭页面之前暂停计时器来完成,让它自动发送一个HTTP请求(尽管如果浏览器被taskmanager杀死,例如),或者简单地让服务器记住最后一次用我们的第二个脚本检查计时器的时间,当用户回来时,它应该检查上次计时器HTTP请求是多长时间以前。如果它是在HTTP请求间隔的两倍以上,那么"最后一次计时器访问"时间可以被认为是暂停时间。