使用Redis队列将发邮件等耗时任务异步化,PHP响应提速;通过Predis连接Redis,生产者用rpush入队,消费者用brpop阻塞监听,配合Supervisor守护进程确保稳定运行。

用户下单后等待3秒才跳转成功页,邮件还没发完页面就卡住——这不是体验问题,是主流程被耗时任务拖死。用Redis队列把发邮件、生成报表、调第三方API这些操作从HTTP请求里彻底剥离,让PHP响应快如闪电。
安装与初始化Redis客户端
先确保服务器已运行Redis服务(默认端口6379),再用Composer引入Predis:composer require predis/predis。
新建config/queue.php,写入连接配置:【必须使用brpop或blpop,不能用rpop/lpop轮询,否则CPU 100%】
$redis = new Predis\Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, 'timeout' => 5,]);
立即学习“PHP免费学习笔记(深入)”;
生产者:把任务推入队列
在订单创建完成的瞬间,立刻投递异步任务,不等执行结果:
第一步:组装任务数据,必须包含唯一标识和可序列化内容
第二步:用rpush或lpush写入指定队列名,推荐用rpush保证先进先出
$payload = [ 'job' => 'send_welcome_email', 'user_id' => $user->id, 'email' => $user->email, 'timestamp' => time(),];$redis->rpush('email_tasks', json_encode($payload));
这一步操作起来很简单,直接把数组json_encode后推进去就行。注意别漏掉timestamp字段——后续监控任务积压时要靠它算延迟。
消费者:常驻进程监听并执行
写一个worker.php,它会永远运行,只做一件事:从队列取任务→解码→调用对应逻辑→标记完成。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
方法一:基础阻塞模式(适合开发环境)
while (true) { $task = $redis->brpop(['email_tasks'], 30); if ($task) { $data = json_decode($task[1], true); sendWelcomeEmail($data['user_id']); }}
方法二:带错误重试与失败隔离(生产必备)
while (true) { $task = $redis->brpop(['email_tasks'], 30); if (!$task) continue; try { $data = json_decode($task[1], true); sendWelcomeEmail($data['user_id']); } catch (Exception $e) { // 失败任务转入dead_letter队列,避免阻塞主线程 $redis->rpush('email_failed', $task[1]); error_log("Email job failed: " . $e->getMessage()); }}
【brpop第一个参数必须是数组,即使只有一个队列名也要写成['queue_name'],否则报错】
守护进程:让Worker永不退出
直接php worker.php & 在终端跑会随SSH断开而终止,必须用Supervisor管理:
第一步:安装supervisor(Ubuntu):sudo apt-get install supervisor
第二步:新建配置文件 /etc/supervisor/conf.d/email-worker.conf
[program:email-worker]command=php /var/www/app/worker.phpdirectory=/var/www/app/user=www-dataautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/var/log/email-worker.log
第三步:加载并启动:sudo supervisorctl reread → sudo supervisorctl update → sudo supervisorctl start email-worker


















