基于计时器的状态更改保存到数据库

时间:2011-04-07 02:16:00

标签: php mysql

我有一个使用MySQL数据库的PHP网站。

我们有用户创建的项目,这些项目在计时器上,一旦此计时器倒计时,没有用户交互(基本上下次有人看到它),状态需要更改。

我不确定如何以一种准确的方式实现这一点。

所以我们有一个对象X,明天晚上10:15到期,下一个看到对象X的人必须看到它过期。

下次加载对象X是否正确的方法是检查它是否已过期,如果是,请更新数据库?

如果有10个人在过期后同时加载对象X会发生什么情况,那么为了防止所有10个尝试更新数据库的请求出现某种竞争条件会怎样?

是否有一个cron作业每分钟运行一次,我可以使用MySQL,或者MySQL中的任何类型的计时器开始每分钟检查这些并运行脚本?

关于它是如何完成的,我有几个想法,就像上面列出的那样,但我不确定最实际的是什么,或者标准的方法是什么,因为我很肯定有人解决了这个问题之前。

2 个答案:

答案 0 :(得分:2)

  

下次加载对象X是否正确的方法是检查它是否已过期,如果是,请更新数据库?

为什么需要更新数据库?看起来您的数据库表可能有一些冗余 - 从您所说的,听起来像(例如)is_expired列,然后是expires_at列。

为什么不摆脱is_expired列?比较2个整数很便宜,所以当你想确定某些东西是否过期时,只需获取expires_at列并与当前时间进行比较。这样就可以避免任何竞争条件到期,因为数据库中没有任何内容发生变化。

答案 1 :(得分:1)

当然,您可以使用cron来完成。或使用javascript本机函数setInterval( "checkFunction()", 10000 );来更改数据库。或者您可以在数据库中使用日期字段并检查到期日期

将字段date_to_expire设为DATE,输入截止日期,每次查询时检查项目是否已过期(最多可达秒)