首页 文章

在cron job php中的无尽循环

提问于
浏览
1

我必须向用户发送批量电子邮件 . 我想在一个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花费的时间比预期的多得多,那么经过一段时间后我会在"waiting"状态下拥有一堆crons . 关于 b) 情况,如果第二个cron完成后立即(返回空),第一个cron结束,所以我将有一分钟的间隙,我需要尽快向用户发送电子邮件 .

另外,qsn 2,在性能方面哪个更好,循环中的一个cron与多个crons?

谢谢

2 回答

  • 1

    你在描述一个守护进程,而不是一个cron任务 .

    有很多守护进程连续运行,所以不,这样做并不是一个坏习惯 .

    如果您希望守护程序在崩溃时自动重新启动,您可以拥有一个监视程序任务,该任务会持续检查守护程序是否正在运行,并在未运行守护程序时启动守护程序进程 .

    另一种选择(正如你所描述的)是有时候尝试启动守护进程的crontask;启动应该检测守护进程是否已经在运行 . 如果它已经在运行,请保留它,然后退出 . 如果它没有运行,那么启动另一个(在后台,作为一个分离的过程 . 无论哪种方式,crontask快速完成 .

    (并且守护进程是否连接到MySQL并不重要 . )

  • 1

    就个人而言,我不喜欢无休止的循环 . 例如,我更喜欢运行每个 5 minutes 的cron作业 . 您可以优化脚本,以便在cron作业时间内发送最大电子邮件数量 .

    您需要估算每分钟发送的电子邮件数量 . 我会假设 1 email per second .

    所以我的想法是:

    • 查询 290 通知[10秒延迟获取和更新通知]并将其标记为“发送”状态(以防止下一个cron不要选择它们) .

    • 发送电子邮件并将结果保存在数组中(以便以后更新) .

    • 完成后,更新通知状态(已发送或错误) .

    只需2美分 .

相关问题