异步发送电子邮件:假脱机、队列和 cronjob/守护程序



我想异步发送电子邮件以获得更快、更轻的 http 响应,但我正在努力解决许多新概念。

例如,文档讨论了假脱机。它说我应该将假脱机与文件一起使用,然后使用命令发送电子邮件。但是我应该如何运行该命令呢?如果我将 cronjob 设置为每 1 分钟执行一次该命令(cron 中可用的最小值),用户平均需要等待 30 秒才能发送他们的电子邮件(例如,注册电子邮件)。

所以我想改用队列。我已经在使用RabbitMQBundle进行图像处理(例如,缩略图创建)。但我只定期使用这个,所以它是从 cronjob 中消耗的。

也许我应该创建一个守护进程,它总是等待新消息到达电子邮件队列并尽快传递它们?

解决方案是将每封电子邮件发送到队列,然后使用该队列与服务一起使用。我的服务非常简单,它只是从队列中取出项目,其中每个项目都是一个数组,其中包含 from、to、body 等,然后发送该电子邮件。我正在使用使兔子更容易使用的 Thumper:github.com/videlalvaro/Thumper .我确保服务始终使用"sv"(来自 Runit):smarden.org/runit/sv.8.html .您可以使用您喜欢的任何其他服务或守护程序管理器。

我和你有同样的问题。你最终是如何解决问题的?

目前,我在crontab中运行一个小脚本以循环运行:

<?php
include('/var/www/vendor/symfony/symfony/src/Symfony/Component/Filesystem/LockHandler.php');
use SymfonyComponentFilesystemLockHandler;
$lock = new LockHandler('mailer:loop');
if ($lock->lock()) {
    system('cd /var/www && php app/console swiftmailer:spool:send');
    sleep(1);
    $lock->release();
    shell_exec('cd /var/www && php LoopMailer.php > /dev/null 2>/dev/null &');
}

它不是很干净,但它可以完成他的工作。

您需要 2 个服务,一个用于假脱机消息,另一个用于发送即时电子邮件。检查这个

最新更新