ThinkPHP 页面空白主因是 PHP 错误被静默屏蔽,需开启 display_errors = On、error_reporting = E_ALL,设 Web 根目录为 public/,确保 runtime/ 可写且权限正确,注释 think\initializer\Error::register() 并排除 BOM 头。

ThinkPHP 页面空白,90% 是 PHP 错误被静默吞掉,不是代码没输出,而是你根本看不到报错。
display_errors 没真开,白屏就注定
宝塔、Nginx、Apache 默认都关了 display_errors,error_reporting 也常被设成 E_ALL & ~E_NOTICE 这类过滤值。结果就是:语法错、类找不到、扩展缺失——全都不报,直接白屏,连 HTTP 500 都不返回。
- 登录宝塔 → 网站 → 对应站点 → 设置 → PHP 版本 → 「配置文件」→ 找到
display_errors = Off,改成display_errors = On - 同时确认
error_reporting = E_ALL(不能是带& ~的表达式) - 改完必须点「保存」,再点「重启 PHP」——只重载配置不够,部分错误要进程级生效
- 刷新页面,如果出现红色
Fatal error: Class 'think\App' not found,说明已成功暴露问题
public 目录没设对,自动加载就崩了
ThinkPHP 6+ 要求 Web 根目录必须是 public/,但宝塔新建站点默认指向项目根(含 app/、config/、public/ 的那层)。这会导致 index.php 被直接执行,vendor/autoload.php 路径错乱,命名空间注册失败。
- 宝塔 → 网站 → 对应站点 → 设置 → 根目录 → 改为
/www/wwwroot/your-site/public(注意不是项目根) - 确认
public/index.php存在且权限至少是644 - Nginx 用户重点看「伪静态」是否选了
thinkphp;Apache 用户确认.htaccess没被宝塔误删或禁用 - 别用
php think run测试——它走 CLI SAPI,和宝塔 Web 环境完全两套逻辑
runtime 权限乱设,缓存写不进就白屏
给整个项目 chmod -R 755 不但无效,还危险:app/、config/、vendor/ 绝对不该被 Web 进程写入。真正需要写的只有 runtime/ 及其子目录。
立即学习“PHP免费学习笔记(深入)”;
- 只对
runtime/执行写权限赋值:chmod -R 775 runtime - 确保所属用户组与 PHP 运行用户一致:
chown -R www:www runtime(宝塔默认 PHP 进程用户是www) - 检查
runtime/log/下是否有按日期生成的日志文件;没有,说明目录不可写或日志配置被覆盖(如log.type设成了test) - 别信宝塔「一键修复权限」——它会把不该写的目录也改成可写
TP 自带错误处理器挡了路
ThinkPHP 5.1+ 默认注册了 think\initializer\Error::register(),会拦截 E_ERROR 并转成 500 或静默丢弃。你看到的“空白”,其实是 TP 把原始致命错误吃了。
- 打开
public/index.php,找到并注释掉这一行:think\initializer\Error::register(); - 或临时关闭调试模式干扰:
APP_DEBUG设为true,同时把config/app.php中的'exception_handle' => \think\exception\Handle::class改成null - 如果
public/index.php开头有ini_set('display_errors', '1'),把它挪到最顶部(任何require前),否则框架加载失败时这行根本没机会执行 - BOM 头也得查:
grep -rl $'\xEF\xBB\xBF' .扫一遍项目,public/index.php和所有配置文件开头都不能有 BOM 或空格
真正卡住人的,往往不是某一个配置,而是多个条件叠加:比如 display_errors 开了,但 runtime 不可写,TP 就在写日志时崩溃;或者伪静态没配,请求压根没进 public/index.php,错误自然无从显示。动手前先确认当前生效的是哪个 php.ini(phpinfo() 看 Loaded Configuration File),别在错误的配置文件里改半天。



















