【发布时间】:2014-08-16 07:02:49
【问题描述】:
我必须向用户发送大量电子邮件。我想在一个 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);
}
现在,这可以使用吗,还是被认为是一种不好的做法?
我知道,我也可以使用多个 cron,假设每分钟一次,但是为了防止在使用锁定文件时重叠,只要 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 花费的时间比预期的多,那么一段时间后,我将有一堆 crons 处于“等待”状态。关于b) 的情况,如果在第二个 cron 完成后(返回空),第一个 cron 结束,那么我将有大约一分钟的间隔,我需要尽快向用户发送电子邮件。
另外,qsn 2,在性能方面,一个 cron 循环与多个 crons 哪个更好?
谢谢
【问题讨论】:
-
我个人认为在 cron 作业中设置无限循环并不是一个好主意。 Cron 适用于需要在特定时间或时间间隔重复的任务,那么下次您的 cron 作业触发时会发生什么?
-
@watcher,感谢您的评论,好点子!但似乎有一个解决方案serverfault.com/questions/111609/…
-
与mysql标签有什么关系?,反正个人id为此创建了一个upstart守护进程[Example, Run PHP script as daemon process],因为inf循环,它会干净得多,而且没有多个正在运行的实例。
-
正如@watcher crons 提到的用于定期任务,你需要的是一个守护进程(我不知道 PHP 是否适合它,一些阅读 kvz.io/blog/2009/01/09/create-daemons-in-php)
-
说到性能,为什么每封邮件都更新表格?如果您发送 1000 封电子邮件,您不想进行 1000 次查询。存储所有更新的 id 数组,完成后只需在 1 个查询中更新它们?