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实现异步发送电子邮件,极大地提升应用程序的响应速度和性能。

相关推荐
用户8307196840825 小时前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
BingoGo14 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack14 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
初次攀爬者1 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php