ThinkPHP项目上线报错主因是环境未对齐:public必须设为Web根目录,需启用opcache(含enable_cli=1)、正确配置vendor/autoload.php路径、确保runtime各级目录可写且属主匹配Web进程用户,并验证Nginx的SCRIPT_FILENAME与root一致。

ThinkPHP项目上线不是“传完就跑”,90%的线上报错(500、白屏、404、Class 'think\App' not found)都源于部署时漏掉某个硬性条件——不是框架有问题,是环境没对齐。
public 必须设为 Web 根目录,否则直接暴露敏感文件
把整个 ThinkPHP 项目扔进 /var/www/html/ 是最常见错误。app/、config/、runtime/ 这些目录一旦被 Web 服务器直接访问,数据库配置、路由缓存、日志内容全可能泄露。
- Nginx 配置中
root必须指向项目内的public/目录,例如:root /www/wwwroot/myapp/public; - Apache 要启用
mod_rewrite,且站点配置里必须写AllowOverride All(不能是None),否则public/.htaccess不生效 - 如果只能部署在子目录(如
https://site.com/tp6/),除了 Nginx 的location加前缀,还得在config/app.php里显式设置'base_url' => '/tp6'
runtime 目录权限和写入必须手动验证
权限设成 755 不等于能写;chmod -R 777 runtime/ 更是高危操作。真正起作用的是 Web 进程用户(如 www-data 或 nginx)是否拥有该目录的写权限。
- 先确认 Web 用户名:
ps aux | grep -E '(apache|nginx|php-fpm)',再执行chown -R www-data:www-data runtime/(Ubuntu)或chown -R nginx:nginx runtime/(CentOS) - 别只改
runtime/一级,runtime/log/、runtime/cache/、runtime/view/都要逐级可写 - 上传前清空
runtime/cache/和runtime/log/,本地生成的缓存含 Windows 路径或符号链接,Linux 下会静默失败 - 上传后立即测试写入:
php -r "file_put_contents('runtime/test.txt', 'ok');",失败就说明权限或用户归属不对
vendor/autoload.php 加载失败的三大真实原因
Class 'think\App' not found 本质是 Composer 自动加载器压根没跑起来,不是缺文件。
立即学习“PHP免费学习笔记(深入)”;
- 服务器未启用 opcache:运行
php -i | grep opcache,确认opcache.enable和opcache.enable_cli均为On(ThinkPHP 的php think命令依赖 CLI 模式下的 opcache) -
public/index.php里引入路径写死了,比如/Users/xxx/vendor/autoload.php—— 必须改成相对路径:require __DIR__ . '/../vendor/autoload.php'; - 漏传
vendor/目录:Git 部署时检查.gitignore是否排除了vendor/;手动上传务必执行composer install --no-dev,不要复制本地vendor/
APP_DEBUG=false 后白屏,日志却为空?那是异常被丢弃了
关闭调试模式后,ThinkPHP 默认把异常写入 runtime/log/,但如果该目录不可写,异常就彻底消失,页面只剩空白。
- 先确保
runtime/log/可写(见上一条),再临时在public/index.php顶部加一行:var_dump(\think\Env::get('app_debug'));,确认运行时值确实是false - 检查
.env文件是否写了APP_DEBUG=true—— 它优先级高于config/app.php - 用
php think run启动服务时,命令行参数如--debug会强制覆盖配置,上线必须去掉 - 别依赖浏览器刷新看效果:清空浏览器缓存,同时删掉
runtime/cache/下所有缓存文件,避免旧路由或配置残留
最易被忽略的点:Nginx 的 fastcgi_param SCRIPT_FILENAME 必须和 root 对齐,否则 PHP-FPM 找不到 index.php,连入口都进不去——这个错不会报在日志里,只会返回 404 或 500。



















