PHP项目中需用Workerman结合Redis实现异步任务处理:安装Redis及predis扩展,生产者序列化任务入队,消费者常驻进程监听执行,并支持ACK与Redis Stream两种可靠性机制。

要在PHP项目中让耗时操作不卡住用户请求,必须把发送邮件、生成报表、处理图片这类任务从主流程里剥离出来异步执行——Workerman结合Redis正是实现这一目标最轻量又可靠的方案。
准备工作:环境与扩展安装
确认你的服务器已运行Redis服务,端口默认6379;PHP需启用redis扩展,可通过php -m | grep redis验证。若未安装,用pecl install redis命令安装,注意PHP版本与扩展版本匹配,否则new Redis()会报错。
项目根目录执行:composer require predis/predis。不要用ext-redis原生扩展直接在Worker里做长连接,它不支持连接复用,高并发下极易触发TIME_WAIT风暴。
生产者:把任务塞进Redis队列
业务代码中,当需要异步处理时,构造任务数组并序列化为JSON:
$task = ['job' => 'send_email', 'data' => ['to' => 'user@example.com', 'subject' => '欢迎注册']];
使用Predis客户端推入List队列:$client->lPush('queue:default', json_encode($task));
【队列名必须带命名空间前缀,如queue:default,避免多个项目共用Redis时键名冲突】
消费者:Workerman常驻进程监听并执行
创建worker.php文件,内容如下:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
第一步:引入自动加载器和Predis客户端
第二步:实例化Worker对象,设置进程数为4(根据CPU核心数调整)
第三步:在onWorkerStart回调中建立Redis连接,并启动BRPOP阻塞监听
第四步:收到任务后,用json_decode解析,调用对应处理器,例如call_user_func(['EmailService', 'handle'], $data);
第五步:执行成功后记录日志,失败则重试三次再丢入死信队列queue:failed
增强可靠性:加入ACK与重试机制
方法一:手动ACK模式
生产者推送任务时附带唯一ID,消费者执行完再向Redis写入SET ack:{id} 1 EX 3600;若超时未写入,则认为失败,由巡检脚本捞出重投。
方法二:利用Redis Stream(需Redis ≥5.0)
用XADD mq * job send_email data {"to":"..."}写入,消费者用XREADGROUP GROUP wg consumer1 COUNT 1 STREAMS mq >读取,再用XACK mq wg {id}确认。此方式天然支持多消费者、消息回溯、pending列表查看。
【Stream模式下务必提前用XGROUP CREATE创建消费者组,否则XREADGROUP会报错】

















