ThinkPHP部署多项目必须使用TP6.1+及think-multi-app扩展,删app/controller目录、创建子应用、清缓存四步不可少;域名绑定需在入口文件中手动调用App::bind(),Nginx/Apache统一指向public目录;路由需逐个导入,静态资源路径须按应用区分。

ThinkPHP部署多项目,不是靠“改几个配置”就能跑通的事。核心在于:TP5不支持真多项目,必须用TP6+官方扩展;而TP6的多应用不是自动识别,得靠结构、入口、路由三者联动才稳。
先确认你用的是TP6,不是TP5
TP5压根没有原生多应用能力。所有网上说的“TP5多应用教程”,本质是手动复制入口文件或硬切目录前缀,结果是配置混杂、类加载失败、升级PHP 8后直接报错。真要跑多个独立项目(比如前台、后台、API),唯一可靠路径是:升级到ThinkPHP 6.1+,并安装topthink/think-multi-app扩展。
四步建好应用骨架
缺一不可,顺序不能乱:
- 执行
composer require topthink/think-multi-app,装好扩展 - 删掉
app/controller/这个TP5遗留的单应用标志目录(不删,框架拒绝进入多应用模式) - 用命令创建应用:
php think app:create admin、php think app:create api,生成app/admin/、app/api/等完整子目录 - 清空缓存:
php think clear:all,否则旧路由规则会掩盖新配置
域名绑定不能只靠config配置
config/app.php里的domain_bind在TP6多应用下完全无效。真正起作用的是入口文件逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 在
public/index.php中,require autoload.php之后、App::run()之前,加入判断:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') { \think\App::bind('admin'); }
- Nginx/Apache必须把每个域名指向同一个
public/目录(不是多个入口文件),靠PHP层动态绑定应用名 - 别用
try_files $uri $uri/ /index.php?$query_string这种通用伪静态——它会绕过PHP入口判断
路由和静态资源要各自管好自己的地盘
多应用不是“自动分发”,得手动拉通:
- 在
config/route.php里逐个导入:Route::import('admin', 'admin');、Route::import('api', 'api'); - 每个应用的路由文件(如
app/admin/route/app.php)必须以use think\facade\Route;开头,并定义自己的路由规则 -
static()函数不感知当前应用,所以模板里别写static('css/app.css'),改用绝对路径:/static/admin/css/app.css,或在各应用配置里重定义__STATIC__常量



















