Php 使计时器在过期记录上运行代码

Php 使计时器在过期记录上运行代码,php,mysql,timer,Php,Mysql,Timer,我正在开发一个web应用程序(PHP/MySQL),在其中我需要实现计时器(recordidexpires atexpiration\u date),其中过期涉及更新记录的状态,并根据需要执行任意代码 我基本上需要一个BPMN定时器事件 我考虑过的选项中,没有一个让我感到兴奋: Cronjob调用应用程序中的函数,该函数只查询和更新过期记录 在代码中常见的调用点,以固定的间隔调用此函数 这在PHP应用程序中通常是如何实现的 我会选择cronjob选项。我也会选择cronjob选项 然而,我的

我正在开发一个web应用程序(PHP/MySQL),在其中我需要实现计时器(record
id
expires at
expiration\u date
),其中过期涉及更新记录的
状态
,并根据需要执行任意代码

我基本上需要一个BPMN定时器事件

我考虑过的选项中,没有一个让我感到兴奋:

  • Cronjob调用应用程序中的函数,该函数只查询和更新过期记录
  • 在代码中常见的调用点,以固定的间隔调用此函数

这在PHP应用程序中通常是如何实现的

我会选择cronjob选项。

我也会选择cronjob选项

然而,我的应用程序中也有逻辑,知道如何处理(或忽略)过期记录。像cron这样的服务可能会崩溃,所以不必依赖它也不错


不幸的是,DBMS并没有给我们这样的灵活性,如果您遇到这些“过期”的记录,您也不想去做数据库维护


最好通过查询、使用视图或简单的应用程序逻辑来排除它们

以下是您尚未考虑的选项:

您可以使用定期在数据库中运行存储的过期例程

这种方法的一些优点:

  • 与平台无关,在UNIX和Windows上的工作方式相同
  • 易于设置。无需向用户解释如何设置cron作业。您只需将事件与数据库模式一起创建即可
缺点:

  • 在MySQL中默认情况下未启用。需要在
    my.cnf
    中启用
    event\u scheduler=on
    ,或者启用它
  • 如果我没记错的话,需要MySQL 5.1或更新版本
例如:

DROP EVENT IF EXISTS expire_event;
DELIMITER //
CREATE EVENT expire_event
ON SCHEDULE EVERY 1 MINUTE
DO BEGIN
    DELETE FROM data WHERE time < UNIX_TIMESTAMP(NOW() - INTERVAL 1 HOUR);
END //
DELIMITER ;
DROP事件(如果存在)expire\u事件;
分隔符//
创建事件过期\u事件
按计划每1分钟
一定要开始
从时间

上面的每分钟都会从数据表中删除UNIX时间戳超过1小时的任何行。

在这种情况下,假设有人可以访问服务器,PHP应用程序中的cron作业非常常见。你不喜欢这种方法的哪一点?我对此的主要抱怨是,我更喜欢像他们所说的那样,在点上执行过期处理。我曾设想过某种daemonized PHP脚本,可以跟踪即将过期的记录并对其进行处理。但是,如果没有办法轻松做到这一点(不编写守护进程,哈哈),我想cron必须这么做。@Alex:1分钟的粒度不够吗?请注意,我处理的大多数过期计时器都设置为整分钟,cronjobs从hh:mm:00开始,因此在大多数情况下都与“在点”匹配。(顺便说一句,PHP不太适合daemonization,但它可以做到)@Piskvor我以前没有考虑过这一点!按照您的建议,我已将过期时间的秒数部分设置为00,因此现在基本上不存在粒度问题。谢谢“DBMS没有给我们这样的灵活性”-类似于
的expiration\u datetime
不够灵活?要么你自相矛盾,要么我误解了。我的意思是作为背景类型的活动。在我使用过的任何数据库中都没有自动的“在周一下午3点终止此记录”功能—它总是归结为一个查询,与其他任务一起运行,或者通过cron或类似的方式作为一个单独的作业运行。你们都是对的,处理crond由于任何原因没有运行的情况是使用cronjobs的一个重要部分。在我的例子中,用户会注意到过期记录的后期处理有一些延迟,但由于排除,它应该会正常地失败。是的,如果我没有同时运行任意PHP代码的要求,这将是一个很好的解决方案。