thinkphp部署失败主因是public目录未设为web根目录、vendor/autoload.php未加载或url重写失效;需确保documentroot/root指向public、执行composer install --no-dev、配置thinkphp专用重写规则,并保证opcache.enable_cli=1及runtime目录洁净可写。

ThinkPHP项目部署失败,八成卡在 public 目录没设对、vendor/autoload.php 没加载或 URL 重写没生效——不是代码有问题,是运行时环境链断了。
Web 服务器根目录必须指向 public 目录
这是最常被跳过的硬性前提。ThinkPHP 6+ 采用「前端控制器」结构,所有请求必须经由 public/index.php 入口统一调度。若把整个项目(含 app/、config/、vendor/)直接扔进 /var/www/html,会导致:
-
app/和config/目录暴露在 Web 可访问路径下,存在源码泄露风险 -
index.php找不到vendor/autoload.php(因相对路径错位),报Class 'think\App' not found - 静态资源(如
public/static/)404,CSS/JS 加载失败
实操建议:
- Apache:在虚拟主机配置中明确指定
DocumentRoot "/path/to/your/project/public",并确保对应<directory></directory>块内有AllowOverride All - Nginx:
root指令必须写成root /path/to/your/project/public;,不是项目根目录 - 宝塔面板:新建站点后,在「网站设置 → 根目录」里手动改为
public子目录
composer install --no-dev 必须在服务器上执行
本地开发时的 vendor/ 目录不能直接复制上传。原因有三:
- 本地和服务器 PHP 版本、扩展可能不同,
autoload_classmap.php等缓存文件不兼容 - 开发依赖(如
phpunit、faker)不该出现在生产环境 - 若用 Git 部署,
vendor/通常被.gitignore排除,上传后为空
实操建议:
- 上传前删掉本地
vendor/和runtime/目录 - 上传
composer.json和composer.lock后,在项目根目录执行:composer install --no-dev --optimize-autoloader - 确认执行后
vendor/autoload.php存在且可读,php -m | grep opcache输出非空,且opcache.enable_cli=1已启用(否则php think命令会失败)
Nginx/Apache 伪静态规则不能套用 Laravel 或 WordPress 模板
ThinkPHP 的路由解析依赖 s= 参数(PATH_INFO 模式),和 Laravel 的 try_files 行为完全不同。错用规则会导致:
- 访问
/index/index404,但加/index.php/index/index能通 - 后台登录页跳转后丢失 session,因路由未正确分发到控制器
实操建议:
- Nginx:在
server块内使用标准规则:location / {<br> if (!-e $request_filename) {<br> rewrite ^(.*)$ /index.php?s=$1 last;<br> }<br>} - Apache:确认
.htaccess在public/目录下,内容为:RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] - 禁用「自动匹配伪静态」功能,手动粘贴 ThinkPHP 专用规则
runtime 和 log 目录权限与清空策略
线上关闭 APP_DEBUG = false 后,错误默认写入 runtime/log/。白屏却不报错,基本是这个目录不可写或已塞满旧日志。
-
runtime/必须存在且 Web 进程可写(Linux 下常用chown -R www-data:www-data runtime+chmod -R 755 runtime) - 不要上传本地生成的
runtime/cache/、runtime/log/、runtime/temp/—— 它们应为空目录结构,由运行时动态创建 - 若部署后路由缓存失效,执行
php think clear清除所有缓存,而非手动删文件 - 检查
config/app.php中'runtime_path'是否被硬编码为绝对路径(如/Users/xxx/runtime),应保持为相对路径__DIR__ . '/../runtime/'
真正卡点往往不在「怎么做」,而在「哪些东西不该传上去」和「哪些配置项看似无关却决定加载成败」——尤其是 opcache.enable_cli 和 runtime 目录的洁净度,90% 的静默失败都藏在这两处。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











