我必须向用户发送批量电子邮件。我想在一个cron作业中有一个无限循环,我想要获取几十个或几百个用户并逐个发送电子邮件 - 更新表格,发送电子邮件。一旦每十几个(或一百个)用户的数据包收到电子邮件,我也应该设置一些休眠间隔。基本上它看起来像
while(1 != 0) {
$notifications = // fetch notifications, where email is not sent
foreach($notifications as $notification) {
// 1) send email
// 2) update table - email was sent
}
sleep(5);
}
现在,这是否可以使用,或者它被认为是一种不好的做法?
我知道,我也可以使用多个crons,让我们说每一分钟,但是为了防止在使用锁定文件时重叠,一旦cron启动并且锁定文件存在(所以另一个cron仍在运行)它应该是
a) wait for some time to the first cron to finish, to start,
or
b) just return empty, allowing the next cron to do the job ASA the ongoing one is done.
a)
的问题在于,如果crons花费的时间比预期多得多,那么经过一段时间后,我会在#34;等待"州。关于b)
情况,如果第二个cron完成后立即(返回空),第一个cron结束,所以我将有一分钟的差距,我需要尽快向用户发送电子邮件可能的。
另外,qsn 2,性能方面哪个更好,循环中有一个cron vs多个crons?
由于
答案 0 :(得分:1)
您描述的守护进程,而不是cron任务。
有许多守护进程连续运行,所以不,这样做并不是一个坏习惯。
如果你希望守护进程在崩溃时自动重启,你可以有一个看门狗任务,它会不断检查守护进程是否正在运行,如果没有运行,则启动一个守护进程。
另一种选择(如你所描述的)是让crontask偶尔尝试启动守护进程;启动应该检测守护进程是否已经在运行。如果它已经在运行,请保留它,然后退出。如果它没有运行,那么启动另一个(在后台,作为一个分离的过程。无论哪种方式,crontask都会很快完成。
(守护进程是否连接到MySQL并不重要。)
答案 1 :(得分:1)
就个人而言,我不喜欢无休止的循环。我更喜欢每隔 5分钟运行 cron job 。 您可以优化脚本,以便在cron作业时间内发送最大电子邮件数量。
您需要估算每分钟发送的电子邮件数量。我假设每秒 1封电子邮件。
所以我的想法是:
我的2美分。