2011-03-10 75 views
0

基本上,我有一个表格叫做事件:使用MySQL的现场计时器(&php)

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。同样,最多只有100行将在active_events内。

要做到这一点,最好的方法是什么?

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

有什么想法? (我要去吃午饭,并会更新这个或以后的任何帖子发表评论)

编辑:! 返回从午餐......我忘了要注意的是倒计时需要每一个动作放在时间重置它(用户投票)。为了我的大脑和思维,让我们说每次有人接受其中一个事件时,它被存储到accepted_events中,并且active_events倒计时必须重置为20.

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

中运行VM实例ON MACBOOK PRO

这是没有事件

顶部 - 11点56分59秒达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事件:

更新测试设置计时器=计时器1

顶部 - 12时00分08秒向上1:32,1个用户,平均负载:0.06,0.04,0.00 任务:92总,2运行,88睡眠,2个停止,0个僵尸 Cpu:0.3%us,0.3%sy,0.0%ni,99.0%id,0.0%wa,0.3%hi,0.0%si,0.0%st Mem:510552k total,501720k使用,8832k免费, 74996k缓冲区 交换:1048568k总,使用0K,1048568k免费,253244k缓存

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

回答

0

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

我只是有一张200个记录的表格,我每秒递减一次值。

timer | location_id | queue_id 

如果记录命中0,抢下queue_id并将其插入到那里,然后复位定时器......我会想别的办法来做到这一点以后,就目前来看,我没有看到一个性能不佳......如果需要,我可以为此拥有自己的服务器/数据库。

0

不要存放定时器店的实际时间时间是由于完成并始终将其与当前时间进行比较。根据需要更新完成时间。

+0

棘手的是,当某人“投票”或对事件做出动作时,计时器重置(类似于quibids重置的方式)。我还能这样做吗? – Jordan 2011-03-10 20:56:06

+0

是的。想想每个重置只是改变定时器完成时的时间戳。当在代码中显示时间时,只需将当前时间与结束时间进行比较,然后显示差异即可。所以你只更新更改的结束时间不会随实时更改,这在数据库中是非常不切实际的。 – 2011-03-11 20:09:55

+0

我还没有看到你如何能够完成所有的逻辑,并且创建一个“实况”定时器,而不必更新当前“实时”事件之后应该执行的所有事件的开始时间。 – Jordan 2011-03-11 23:03:15