Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确存储事件';mySQL数据库中的重复出现和复杂提醒?_Php_Mysql_Database_Symfony_Time - Fatal编程技术网

Php 如何正确存储事件';mySQL数据库中的重复出现和复杂提醒?

Php 如何正确存储事件';mySQL数据库中的重复出现和复杂提醒?,php,mysql,database,symfony,time,Php,Mysql,Database,Symfony,Time,我想在mySQL数据库中存储事件的重复发生(另外,我正在使用Symfony 3和ORM) 例如: 每3天/每周一次/双月/半年/每年一次 为了能够方便地对此类数据执行查询,存储此类数据的最佳方式是什么 此外,我想根据这些重复事件创建复杂的提醒 例如: 二月至九月:每周一次,十月至一月:双月 我如何管理提醒的日期计算?我应该存储开始日期并每次计算下一个日期,还是应该在提醒标记为已完成时仅存储下一个日期 (我的用例:为浇水植物设置提醒) 非常感谢您分享您的想法 问候 如果您在Linux机器上,您可以

我想在mySQL数据库中存储事件的重复发生(另外,我正在使用Symfony 3和ORM)

例如: 每3天/每周一次/双月/半年/每年一次

为了能够方便地对此类数据执行查询,存储此类数据的最佳方式是什么

此外,我想根据这些重复事件创建复杂的提醒

例如: 二月至九月:每周一次,十月至一月:双月

我如何管理提醒的日期计算?我应该存储开始日期并每次计算下一个日期,还是应该在提醒标记为已完成时仅存储下一个日期

(我的用例:为浇水植物设置提醒)

非常感谢您分享您的想法


问候

如果您在Linux机器上,您可以使用cron作业来检查,无论检查频率如何。我会创建一个控制台应用程序来执行此操作,以便更容易调用cron作业。创建控制台应用程序比您想象的要简单。对于数据库,我将存储每个事件的一般信息(名称、标题、描述)和一个间隔字段,该字段将说明触发通知的频率。最初存储添加事件时的当前日期和时间,然后在间隔时间超过触发时间时存储通知,并存储通知的日期和时间。这是我能想到的最简单的方法。有关控制台命令,请参见此处的更多信息。

您可以在MySQL本身中设置事件,或者按照pogeybait的建议,您可以编写一个cron作业和一个命令

如果需要服务器在数据库之外执行某些操作,则可能需要cron作业。如果它都包含在数据库中(比如只需将“plants\u need\u watering=false”列更新为“plants\u need\u watering=true”,而无需发送电子邮件或启动其他程序),那么我认为MySQL事件更合适

这里有一个关于事件的非常好的教程(尽管我在尝试时不得不使用分隔符):

这是我写的一个简单的事件。您可以看到它如何根据日期更新db列。我将我自己的“事件”(不是MySQL事件,而是我应用程序中的一个实体)的状态设置为“投票已关闭”。如果“投票结束”日期已过,并且每12小时运行一次,我知道我不会意外错过一次。这只是作为常规SQL输入一次,您可以在本地开发人员机器上练习并检查结果,方法是将计划设置为每小时左右,检查它是否工作,然后切换回实际所需的时间范围以运行事件:每周、每月等

        SET GLOBAL event_scheduler = ON;
        CREATE EVENT switch_event_status
        ON SCHEDULE EVERY 12 HOUR
        DO
        UPDATE event_status
        INNER JOIN
        event ON event_status.id = event.event_status_id
        SET
        event_status.value = \'Voting is closed.\'
        where 
        event.voting_end <= cast(now() as date);
SET GLOBAL event_scheduler=ON;
创建事件开关\u事件\u状态
按计划每12小时一次
做
更新事件状态
内连接
事件上的事件\u status.id=事件.event\u status\u id
设置
事件\u status.value=\'投票已结束。\'
哪里
事件。投票结束