Class "think\App" not found主因是自动加载失效:未启用opcache或opcache.enable_cli=0;public/index.php中vendor/autoload.php路径硬编码;漏传vendor目录或runtime不可写。

ThinkPHP项目上线不难,但线上报错(500、空白页、404、Class "think\App" not found)几乎全是部署时漏掉某个硬性条件导致的,不是框架问题,是环境没对齐。
为什么上传后直接 Class "think\App" not found?
这不是缺文件,是自动加载器根本没跑起来。核心就两个原因:
- 服务器没开
opcache,或开了但opcache.enable_cli=0(ThinkPHP 的命令行缓存生成和路由加载都依赖 CLI 模式下的 opcache) -
vendor/autoload.php路径在public/index.php里被写死了,比如写成/Users/xxx/project/vendor/autoload.php,一上 Linux 就失效 - 漏传了
vendor/目录,或者用 Git 部署时vendor/在.gitignore里被跳过
检查方式:php -i | grep opcache 看是否启用;再确认 public/index.php 第 12 行左右的引入路径是不是用了 __DIR__ . '/../vendor/autoload.php'。
Nginx 下访问首页 404 或必须带 /index.php?
根本原因是请求压根没进 index.php,Nginx 没做重写转发。别套用 Laravel 或 WordPress 的规则,ThinkPHP 要的是明确把非静态请求推给入口文件。
立即学习“PHP免费学习笔记(深入)”;
-
root必须指向项目public/目录,不是整个项目根目录 - 用
try_files而不是rewrite:在location /块里写try_files $uri $uri/ /index.php?s=$uri&$args; - 如果部署在子目录(如
https://site.com/shop/),try_files要改成/shop/index.php?s=$uri&$args;,同时配置config/app.php中的'base_url' => '/shop' - 确认
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;—— 这个值必须和root对齐,否则 PHP-FPM 找不到index.php
runtime 目录权限不对会怎样?
不是报错,是静默失败:首次访问直接 500,错误日志却写不进 runtime/log/,因为连 runtime/ 自身都不可写。
- Linux 下执行:
chmod -R 755 runtime/,然后手动测试:php -r "file_put_contents('runtime/test.txt', 'ok');" - 宝塔用户注意:
runtime/cache/、runtime/log/、runtime/view/这些子目录要逐级可写,不能只改runtime/一级权限 - 别上传本地已生成的
runtime/cache/和runtime/log/,清空再传,避免 Windows/Linux 文件权限/符号链接差异引发问题
APP_DEBUG=false 后白屏,日志又为空?
这是最隐蔽的问题:关闭调试模式后,ThinkPHP 默认把异常写入 runtime/log/,但如果该目录不可写,异常就丢了,页面直接空白,没有任何提示。
- 先临时改回
APP_DEBUG=true,看能不能爆出真实错误(比如数据库连不上、mbstring扩展没开) - 确认
php.ini中display_errors = Off(生产环境必须关),但log_errors = On且error_log指向可写位置 - 检查
mbstring是否启用:php -m | grep mbstring,没开会导致路由解析失败,现象就是白屏 + 无日志
真正卡住人的从来不是“怎么配”,而是 public 没设为 Web 根目录、runtime 子目录权限遗漏、opcache.enable_cli 关着这三件事——它们不出错则已,一出就是全站挂,且毫无线索。



















