thinkphp可通过二级域名绑定与自定义队列处理器实现按域名分发任务:需配置域名识别与多应用、入队时固化domain字段、消费者按domain分流处理,支持静态绑定与动态子域名saas场景。

ThinkPHP 本身不直接提供「按域名自动分发队列任务」的机制,但你可以通过二级域名绑定 + 自定义队列处理器,实现不同域名触发的任务进入专属业务队列、由对应消费者处理。关键不在队列系统本身,而在于任务入队时携带域名上下文,并在消费端依据该上下文路由逻辑。
一、确保二级域名已正确绑定到对应应用
这是前提。若 admin.example.com 和 api.example.com 都落到同一个默认应用(app/),后续就无法区分业务来源。
- 在 config/app.php 中启用多应用与域名识别:
'url_domain_deploy' => true,'domain_bind' => ['admin.example.com' => 'admin','api.example.com' => 'api',], - 确认已创建独立应用目录:app/admin/、app/api/,且各含 controller/、command/ 等标准结构
- Nginx/Apache 必须透传
HTTP_HOST,例如 Nginx 中加:fastcgi_param HTTP_HOST $host;
二、任务入队时显式标记域名来源
不要依赖运行时解析 Host —— 队列任务可能异步执行,Host 已不可用。应在投递时固化域名信息。
- 在 admin 应用中发任务:
queue('send_notification')->push(['domain' => 'admin.example.com', 'user_id' => 123, 'template' => 'welcome']); - 在 api 应用中发任务:
queue('process_data')->push(['domain' => 'api.example.com', 'data_id' => 456]); - 也可封装成方法,自动注入当前请求域名:
$this->request->host()(仅限同步请求上下文)
三、配置专用队列消费者并按 domain 分流
使用 ThinkPHP 命令行命令启动不同消费者,监听不同队列,或同一消费者内做 domain 路由判断。
- 方式一:分离队列名(推荐)
投递时指定队列:queue('admin_notifications')->push([...]);queue('api_processes')->push([...]);
再分别启动:php think queue:listen --queue=admin_notificationsphp think queue:listen --queue=api_processes - 方式二:统一队列 + 消费时判断
所有任务进business_tasks队列,消费者中:if ($job['domain'] === 'admin.example.com') { $this->handleAdminTask($job); }elseif ($job['domain'] === 'api.example.com') { $this->handleApiTask($job); }
四、高级场景:动态子域名(如 shop1.example.com)对接独立队列
适用于 SaaS 多租户,每个商户子域名需隔离处理任务。
- 关闭
domain_bind静态绑定,改用中间件提取子域名并存入 Request:$sub = strtok($this->request->host(), '.');$this->request = $this->request->withParam('sub_domain', $sub); - 入队时带上
'tenant' => $sub字段 - 消费者根据
tenant查询数据库获取租户配置(如专属 Redis 队列名、数据库连接、超时策略) - 可结合 Redis 的
LIST或STREAM实现物理队列隔离
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











