使用MySQL(& php)的实时计时器

时间:2011-03-10 19:21:52

标签: php mysql

基本上,我有一个名为event的表:

id |标题|倒计时|描述|活跃的|已过期| created_at |的updated_at

我开始构思如何使用MySQL或PHP创建“LIVE”事件。所以我想我可以使用Cron引用PHP或使用直接SQL的事件。

所以我的想法如下:

将我的表格重组为:

事件: id |标题|描述| created_at |的updated_at

event_queue: id | event_id的

active_events: event_id |倒计时|迭代

expired_events: event_id | expired_at

因此,如何创建一个活动计时器以每秒运行一次,每秒最多更新一次active_events中的100行?

进入active_events的示例数据如下:

event_id:1, 倒计时:20(20分钟), 迭代:90

我想每秒递减倒计时,当它达到0时,递减迭代并开始倒计时回到20.一旦迭代为0且倒计时为0,只需完全删除该条目,然后归档事件到expired_events。同样,active_events中最多只能有100行。

这样做最好的方法是什么?

基本上这是一个内部应用程序,人们可以在办公室投票,如果没有投票,那么它就会消失。以上结构就是我想要的结果,看它是否有效。

有什么想法? (我必须去吃午餐并将更新此内容或稍后对任何帖子发表评论)

编辑: 从午餐回来!...我忘了注意倒计时需要在每次操作时重置(用户对其进行投票)。为了我的大脑和思考,让我们说每当有人接受其中一个事件时,它就会存储到accepted_events中,并且active_events倒计时必须重置为20。

这是我的服务器顶部运行mysql事件而不是:

在MACBOOK PRO上的VM实例中运行

这没有事件

top - 11:56:59 up 1:29,1位用户,平均负载:0.11,0.06,0.01 任务:共92个,2个跑,88个睡觉,2个停止,0个僵尸 Cpu(s):0.0%us,0.0%sy,0.0%ni,99.7%id,0.0%wa,0.0%hi,0.3%si,0.0%st 内存:510552k总计,499364k使用,11188k免费,74316k缓冲区 交换:1048568k总计,0k使用,1048568k免费,251872k缓存

这是在事件计划并在200行上运行以下sql:

update test set timer = timer-1

top - 12:00:08 up 1:32,1位用户,平均负载:0.06,0.04,0.00 任务:共92个,2个跑,88个睡觉,2个停止,0个僵尸 Cpu(s):0.3%us,0.3%sy,0.0%ni,99.0%id,0.0%wa,0.3%hi,0.0%si,0.0%st 内存:510552k总计,501720k使用,8832k免费,74996k缓冲区 交换:1048568k总计,0k使用,1048568k免费,253244k缓存

编辑#2:这是我的意思草图 - http://oi51.tinypic.com/29c1bp4.jpg

2 个答案:

答案 0 :(得分:0)

不要将计时器存储的实际时间存储到完成时间,并始终将其与当前时间进行比较。在需要时更新完成时间。

答案 1 :(得分:0)

我最终创建了一个每秒运行一次的脚本并更新了一个小表。我的服务器上每天有大约250万个独特的视图,而我几乎没有看到这样的性能。

我只有一张包含200条记录的表格,我每秒都会减少这些值。

timer | location_id | queue_id

如果记录达到0,抓住下一个queue_id并将其插入那里,然后重置计时器...我会想到另一种方法,以后再做,现在,我没有看到一个糟糕的性能打击所有...如果我需要,我可以拥有自己的服务器/数据库。