ThinkPHP 5.1 本身不内置 Gearman 支持,但可通过 PHP Gearman 扩展 + 自定义服务层轻松接入,实现耗时任务向多个后端节点分发;关键在于清晰分离「触发」(TP5.1 作为 Client)与「执行」(Worker 独立部署),需先部署 gearmand 服务并确保各节点网络连通、扩展正确加载,再通过封装 GearmanService 实现异步任务提交与结果处理。

ThinkPHP 5.1 本身不内置 Gearman 支持,但可通过 PHP Gearman 扩展 + 自定义服务层轻松接入,实现耗时任务(如邮件发送、文件处理、数据导出)向多个后端节点分发。关键不是框架集成度,而是清晰分离「触发」与「执行」——TP5.1 做好 Client 角色,Worker 独立部署在任意 PHP 环境中。
Gearman 环境准备(多节点)
分布式前提是 Gearman Job Server(gearmand)和 Worker 可跨机器通信:
- 在至少一台服务器(如 192.168.10.100)安装并启动 gearmand:
gearmand -d -p 4730 -l /var/log/gearmand.log - 所有 Worker 节点(如 10.101、10.102、10.103)需安装 gearman PHP 扩展(支持 PHP 7.0–7.4;PHP 8+ 需用
php-gearman替代或改用纯 HTTP 方案) - 确保各节点能通过 TCP 连通 4730 端口(防火墙/安全组放行)
ThinkPHP 5.1 中封装 Gearman Client
建议新建 app/common/service/GearmanService.php,避免业务逻辑耦合:
- 构造函数中初始化
new \GearmanClient(),并调用addServer('192.168.10.100', 4730)指向中心 job server - 提供
doBackground($function, $payload)方法:使用$client->doBackground()提交异步任务,不阻塞响应 - 如需结果回调,可用
$client->doNormal()(同步等待)或搭配addTask()+runTasks()实现批量并行 - 注意序列化:TP5.1 的数组/对象建议用
json_encode()传参,Worker 端再json_decode(),避免 serialize 兼容性问题
Worker 独立部署(非 TP 环境)
Worker 不依赖 ThinkPHP,推荐单独部署为常驻进程(如 systemd 或 supervisor 管理):
立即学习“PHP免费学习笔记(深入)”;
- 新建
/opt/gearman-workers/sendmail.php,内容包含:$worker = new \GearmanWorker(); $worker->addServer('192.168.10.100'); $worker->addFunction('send_email', 'handleSendMail'); -
handleSendMail()函数内可引入 Composer 包(如phpmailer),或直接调用系统命令,无需加载 TP 核心 - 多台机器部署相同 Worker 代码,Gearman 自动负载均衡:同一任务名(如
send_email)注册到多个节点,job server 会轮询分发 - 示例启动命令:
nohup /usr/bin/php /opt/gearman-workers/sendmail.php >> /var/log/sendmail-worker.log 2>&1 &
任务设计与容错要点
真正支撑分布式的关键不在连接数,而在任务语义和失败应对:
- 任务名(function name)要统一且稳定,如
export_order_csv,避免因命名差异导致任务丢失 - Worker 必须具备幂等性:同一 job ID 重复执行不应产生副作用(例如查数据库状态再操作,而非盲目 insert)
- 添加超时与重试:Client 端设置
$client->setTimeout(5000);Worker 处理异常时主动 return false 或抛出异常,Gearman 会标记失败 - 监控建议:通过
gearadmin --status查看队列积压;日志中记录 job handle 和耗时,便于追踪瓶颈节点



















