在实际开发中,邮件发送失败是一种常见问题,比如服务器暂时故障、网络中断、SMTP响应延迟等。为提高系统稳定性,我们可以将邮件任务加入队列,由独立的后台进程异步处理,避免阻塞业务流程。
本文以Beanstalkd为例,讲解如何搭建PHP邮件队列。
首先安装Beanstalkd:
sudo apt-get install beanstalkd
启动服务:
sudo systemctl start beanstalkd
安装PHP Beanstalkd扩展:
pecl install beanstalkd
在php.ini中添加扩展配置:
extension=beanstalkd.so
重启PHP服务:
sudo systemctl restart php-fpm
创建一个用于发送邮件和监听队列的类:
class MailQueue { protected $beanstalk; public function __construct() { $this->beanstalk = new PheanstalkPheanstalk('127.0.0.1'); } public function sendEmail($email, $subject, $message) { // 将邮件任务加入队列 $this->beanstalk->useTube('mail_queue')->put(json_encode([ 'email' => $email, 'subject' => $subject, 'message' => $message, ])); } public function handleEmails() { // 监听队列并处理邮件发送逻辑 while (true) { $job = $this->beanstalk->reserveFromTube('mail_queue'); $data = json_decode($job->getData(), true); // 发送邮件逻辑,这里省略具体实现 $this->sendEmail($data['email'], $data['subject'], $data['message']); // 删除任务 $this->beanstalk->delete($job); } } }
调用类中的方法将邮件加入队列:
$mailQueue = new MailQueue(); $mailQueue->sendEmail('example@example.com', '邮件主题', '邮件内容');
Supervisor 是一个常用的进程守护工具,可以确保队列监听脚本持续运行。
[program:mail_queue_worker] command=php /path/to/mail_queue_worker.php directory=/path/to/project user=www-data numprocs=1 autostart=true autorestart=true process_name=%(program_name)s_%(process_num)02d redirect_stderr=true
将 /path/to/mail_queue_worker.php 替换为你自己的处理脚本路径,确保进程在后台持续监听并处理邮件。
通过PHP结合队列机制,我们能够有效规避邮件发送过程中的各类异常问题,实现系统解耦、任务异步和高可用架构。本文以Beanstalkd为例,介绍了从安装配置、类封装到实际使用的完整流程,适用于大多数PHP邮件发送场景。