我正在创建一个网站,在他们可以指定的时间向大约 800 名用户发送每日新闻电子邮件。我的问题是我的脚本需要很长时间才能运行并且超时,所以我正在寻找一些关于如何更好地解决这个问题的建议。
目前的做法:
用户被放置在一个“邮件队列”数据库表中,其中包含他们的 ID、接收时间和发送标志。
然后我每分钟运行一个 CRON 脚本,它执行以下操作:
- 从邮件队列中获取所有“接收时间”小于或等于现在、尚未发送的邮件
- 遍历用户,加入偏好表以获取他们选择的类别(每个用户最多约 30 个)。
- 对于每个类别,找到最新的 3 篇文章
- 使用 PHPMailer 准备包含此内容的 HTML 电子邮件
- PHPMailer 使用 Mailgun SMTP 来避免我的 SMTP 服务器超载
- 向用户发送邮件,在数据库中标记为已发送
到目前为止,我的观察是:
- 通过在浏览器中运行来测试脚本时,它运行非常缓慢,几分钟然后超时(不发送任何电子邮件)。
- 通过 CRON 每分钟运行一次时,它会在 40 分钟内发送超过电子邮件数量(大约 1400 封)的电子邮件,我猜是因为脚本自身重叠并且发送的标志没有可靠地更新。
大多数用户设置为同时接收他们的电子邮件,所以我在此基础上进行“最坏情况”测试
问题
- 通过查询数据库并为每个用户即时生成 HTML 电子邮件内容,我的脚本是否过于繁重?我想知道提前生成内容并将用户存储在邮件队列中是否会更好。
- 像 Beanstalkd 这样的队列管理器会有所帮助吗?我已经对其进行了研究,但正在努力了解如何实施到我的日常工作中。
最终,我需要将电子邮件在他们期望的时间可靠地发送给每个用户。
非常感谢任何建议!