Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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 使用cron作业为每个用户安排具有可变时间的每日通知_Php_Mysql_Notifications_Cron - Fatal编程技术网

Php 使用cron作业为每个用户安排具有可变时间的每日通知

Php 使用cron作业为每个用户安排具有可变时间的每日通知,php,mysql,notifications,cron,Php,Mysql,Notifications,Cron,我有一个网站,每个用户都可以选择在他选择的时间接收每日电子邮件提醒(为简单起见,假设时区相同) 因此,在他的个人资料中有一个输入框,上面写着“接收电子邮件提醒的时间” 如何在CRON作业中实现这一点 我每时每刻都想做这样的事情: SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now 问题是它会发送多封电子邮件 因此,可能在发送电子邮件后,为每个匹配更新一个标志 UPDATE reg_users SET s

我有一个网站,每个用户都可以选择在他选择的时间接收每日电子邮件提醒(为简单起见,假设时区相同)

因此,在他的个人资料中有一个输入框,上面写着“接收电子邮件提醒的时间”

如何在CRON作业中实现这一点

我每时每刻都想做这样的事情:

SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now
问题是它会发送多封电子邮件

因此,可能在发送电子邮件后,为每个匹配更新一个标志

UPDATE reg_users SET sent_already = 1;
然后将执行上面的查询

SELECT `id`,`email` FROM `reg_users` WHERE `start_time` >= $time_now AND `sent_already` = 0;
但随后需要在一天结束时使用第二个CRON作业将所有记录更新到
send\u ready=0
。看起来有点马虎


有人有更好的解决方案吗?

让cron运行x分钟,运行类似的程序

SELECT `cols` FROM `Emails_Queue` WHERE `Timestamp` <= NOW() LIMIT 0,50
DELETE FROM `Emails_Queue` WHERE `colid` = ?
SELECT `cols` FROM `Emails_Queue` WHERE `User` = ? AND `Timestamp` = ?
插入问题。你可以用类似的方法来检查

SELECT `cols` FROM `Emails_Queue` WHERE `Timestamp` <= NOW() LIMIT 0,50
DELETE FROM `Emails_Queue` WHERE `colid` = ?
SELECT `cols` FROM `Emails_Queue` WHERE `User` = ? AND `Timestamp` = ?
如果没有返回结果

或者,您可以有一个类似于
User
Timestamp
的复合键,并有一个
ON UPDATE NO ACTION
,但这仅在数据库引擎支持键的情况下才起作用。然后您可以执行以下操作

INSERT INTO `Emails_Queue` (`cols`) VALUES (val)
或者你可以让cron动态创建它们

SELECT `cols` FROM `Emails_Queue` WHERE `Not_Sent` = TRUE AND `Timestamp` <= NOW() LIMIT 0,50
每周通过cron执行以下操作

UPDATE `Emails_Queue` SET `Not_Sent` = TRUE WHERE `Not_Sent` = FALSE

为什么不编写一个查询,从表中构建
crontab
文件,然后让
cron
执行所有调度?创建一个包含发送时间的电子邮件队列,如果发送时间为@Barmar,则不知道您的意思。我使用cpanel来调度cron作业。所以无法访问。为什么不让1个进程每X次运行一次检查发送什么/谁?这不是一个真正的时间/cpu消耗过程,你可以在DE中安排你想要的内容(如循环期间的分散发送或批量发送…)@NeronLeVelu你是说时间间隔检查?这样做的问题是可能会有一个小的时间差异,通知不会在时间间隔内。问题是如何防止多次插入邮件队列?i、 e.您最初如何选择每天只插入一次的记录?是否需要第二个cron作业每天运行一次?您可以只运行一个cron作业来发送电子邮件。这将取决于您希望如何输入值,当用户希望收到通知时,您可以在用户输入后输入这些值,或者让cron每隔x分钟运行一次,以输入/检查电子邮件是否不在队列中。一旦您掌握了基本知识,这将非常容易。它只是确保发送的时间和/或未发送的时间是正确的/重置它们,这样你就不会给别人发送超过需要的电子邮件,或者根本不发送任何电子邮件。