Php 根据日期自动更新MYSQL表

Php 根据日期自动更新MYSQL表,php,mysql,modeling,Php,Mysql,Modeling,我有一个保存事件信息的MYSQL表。我需要一个机制,根据每个事件的日期更新其状态(“结束”如果是过去的日期)。 做这样的事情最好的方法是什么?当任何用户登录时更新事件的状态(对大多数用户来说是无用的例程)、创建某种内部任务(如cron作业?)或任何其他方式。 现在,只有创建者登录时才会更新事件的状态。这是可行的,但在创建者登录之前,其他用户会将事件视为“已计划”,即使该日期已过。顺便说一下,我正在使用PHP。谢谢我建议在请求状态时随时更新状态。或者更好的是,根本不在数据库中存储状态,而是在每次请

我有一个保存事件信息的
MYSQL
表。我需要一个机制,根据每个事件的日期更新其状态(“结束”如果是过去的日期)。 做这样的事情最好的方法是什么?当任何用户登录时更新事件的状态(对大多数用户来说是无用的例程)、创建某种内部任务(如cron作业?)或任何其他方式。
现在,只有创建者登录时才会更新事件的状态。这是可行的,但在创建者登录之前,其他用户会将事件视为“已计划”,即使该日期已过。顺便说一下,我正在使用
PHP
。谢谢

我建议在请求状态时随时更新状态。或者更好的是,根本不在数据库中存储状态,而是在每次请求时根据其他变量计算状态。因此,每当您有一个状态列表或有人请求状态时,只需将事件日期与今天的日期进行比较,并向他们发送“未开始”、“正在进行”或“结束”


当然,除非您需要更多可能的状态(“计划”、“准备”、“设置”等)。然后,您可能需要这些状态的预定日期/时间,或者需要存储一个状态变量。无论哪种方式,您都可以在请求时更新状态(根据今天的日期和任何其他相关信息)。

在用户登录时更新不是一个好主意,因为这会增加太多的压力(如果有很多用户)。最好的方法是在每天早上12点后或一天开始时运行cronjob。如果您仍然想保留旧代码,请使用日期代码将其包装起来。 pseudo将如下所示:

$updated_last = last modification time of the file "updated";
if($updated_last is more than 1 day) {
 update db; (your old code)
 touch file "updated";
}
用这个,

UPDATE events SET status = 'over' WHERE DATE(event_date) > NOW();

每天运行一次,一天一次。

我会选择午夜cron作业,除非你必须处理很多时区。重新计算似乎相当浪费,从维护的角度来看,按需计算可能会变得相当混乱,因为它使数据库处于部分不正确的状态。

每个答案都接受您的更新原因。 然而,让我对这一决定提出质疑,并从评论中引申出斯帕内尔上校的建议

更新可能被视为浪费资源,因为您可以在运行时使用内存中的日期比较进行计算(这比存储的I/O快几个数量级)

这有两种方法:

  • 查询/视图可以做到这一点(而且成本应该可以忽略不计)
  • 在检索结果后,实际上在php端执行此操作(将其视为格式化/表示任务)
  • 它甚至可以在客户端完成,如果可能的话,性能方面是最好的解决方案(这可能会导致维护/安全问题)

当然,忽略这些解决方案可能有合理的理由,但我认为性能本身是不够的(大多数数据库受I/O限制)。

在请求事件时更新它。日期是唯一的标准吗?那你为什么要更新任何东西?使用一些日期算法,例如,将日期值与now()进行比较。这是一个很好的观点,但应用程序严重依赖于事件状态,因此不可以经常比较日期。如果该状态只被请求了几次,这将是有意义的。根据请求更新是一种选择。我感谢你们两位。按要求更新是最好的选择。不将状态存储在数据库中会使一切变得更加复杂。列出过去的事件是应用程序中的一项常见任务,每次请求列表时都需要大量处理。取决于事件状态的内容太多。谢谢。@JoaoPedro,根据事件状态的不同,存在“太多内容”这一事实并不一定证明在数据库中存储额外数据是合理的——事实上恰恰相反;大多数数据库系统都是I/O绑定的,这意味着它们正在等待数据被读/写到存储器中或从存储器中读/写出来,向混合中添加额外的不必要且极为便宜的可计算列通常会降低系统的速度(!)。对于单个字段(加上索引)来说不是很多,但是如果作为一个原则使用,那么它会堆积起来。我认为cron作业不会这样做,因为事件状态可能会在事件创建几小时后被请求并更改为“结束”。谢谢though@JoaoPedro“事件创建几小时后,可能会请求事件状态并将其更改为“结束”。这不是正确的操作吗?如果状态是基于日期的,那么状态会在午夜改变,或者我错过了什么?