PHP中使用RabbitMQ实现异步发送电子邮件可以显著提升应用的表现,尤其是在需要大量发送邮件的场景下

前提条件

安装RabbitMQ服务。

安装PHP的RabbitMQ客户端库(php-amqplib)。

安装邮件发送库(如PHPMailer)。

安装php-amqplib和PHPMailer

首先,通过Composer安装这些库:

复制代码
composer require php-amqplib/php-amqplib
composer require phpmailer/phpmailer

发送邮件到RabbitMQ队列

以下代码展示了如何创建一个PHP生产者,用于将发送邮件的任务推送到RabbitMQ队列中。

生产者代码 (producer.php)

php 复制代码
<?php
require_once 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// RabbitMQ连接信息
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);

// 邮件数据
$emailData = [
    'to' => 'recipient@example.com',
    'subject' => 'Test Email',
    'body' => 'This is a test email.'
];
$emailJson = json_encode($emailData);

$msg = new AMQPMessage($emailJson, ['delivery_mode' => 2]);
$channel->basic_publish($msg, '', 'email_queue');

echo " [x] Sent email task to queue\n";

$channel->close();
$connection->close();
?>

消费队列发送邮件

接下来,编写消费者代码,从RabbitMQ队列中获取任务并发送邮件。

消费者代码 (consumer.php)

php 复制代码
<?php
require_once 'vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

// RabbitMQ连接信息
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);

echo " [*] Waiting for email tasks. To exit press CTRL+C\n";

$callback = function ($msg) {
    $emailData = json_decode($msg->body, true);
    sendEmail($emailData);
    echo " [x] Sent email to " . $emailData['to'] . "\n";
};

$channel->basic_consume('email_queue', '', false, true, false, false, $callback);

while($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

function sendEmail($emailData) {
    $mail = new PHPMailer(true);

    try {
        // 服务器设置
        $mail->isSMTP();
        $mail->Host       = 'smtp.example.com';  // 请设置 SMTP 服务器地址
        $mail->SMTPAuth   = true;
        $mail->Username   = 'your_email@example.com';  // SMTP 用户名
        $mail->Password   = 'your_email_password';  // SMTP 密码
        $mail->SMTPSecure = 'tls';  // 启用TLS加密
        $mail->Port       = 587;  // TCP端口号

        // 收件人
        $mail->setFrom('your_email@example.com', 'Mailer');
        $mail->addAddress($emailData['to']);

        // 内容
        $mail->isHTML(true);
        $mail->Subject = $emailData['subject'];
        $mail->Body    = $emailData['body'];

        $mail->send();
        echo "Message has been sent\n";
    } catch (Exception $e) {
        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}\n";
    }
}
?>

使用Supervisor管理消费者进程

为了确保消费者进程始终在运行,可以使用Supervisor来管理。

安装Supervisor

在Ubuntu上可以使用以下命令安装:

bash 复制代码
sudo apt-get install supervisor

配置Supervisor

在/etc/supervisor/conf.d目录下创建一个新的配置文件,如email_consumer.conf:

bash 复制代码
[program:email_consumer]
command=php /path/to/your/consumer.php
autostart=true
autorestart=true
stderr_logfile=/var/log/email_consumer.err.log
stdout_logfile=/var/log/email_consumer.out.log

重新加载Supervisor配置:

bash 复制代码
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start email_consumer

测试

1、运行php producer.php将邮件任务发送到队列。

2、确保消费者(php consumer.php)正在运行并处理队列中的任务。

通过这种方式,您可以在PHP中使用RabbitMQ实现异步发送电子邮件,极大地提升应用程序的响应速度和性能。

相关推荐
叼烟扛炮2 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
zhikouai5 小时前
把外部助手接进聊天软件的架构分层与参数配置
服务器·网络·php
叼烟扛炮9 小时前
Linux 学习笔记(五十八):IO 多路复用封神——epoll 底层原理揭秘
linux·运维·服务器·网络·笔记·学习·php
叼烟扛炮9 小时前
Linux 学习笔记(五十一):数据链路层与 ARP 协议——局域网寻址与黑客骗局
linux·网络·网络协议·php·tcpdump
vipxieliang15 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
东鹏特饮1 天前
系统运维(传统/通用运维)面试题
开发语言·php
多客:duokelijie1 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
一条泥憨鱼1 天前
【消息队列】ACK确认了什么:消息队列可靠投递的完整链路
java·后端·kafka·消息队列·rabbitmq
从琳开始9891 天前
网络原理入门(二)------OSI七层模型?TCP/IP五层(四层)模型原来是这样的
java·网络·tcp/ip·java-ee·php
BingoGo2 天前
PHP 标准库的价值远不止少写几行代码
后端·php