PHP 8.3 升级后白屏主因是错误被默认静默屏蔽,需先在php.ini中设display_errors=On、error_reporting=E_ALL、log_errors=On、error_log路径可写,并重启服务;再查PHP及Web服务器错误日志;绕过框架错误处理器;最后排查@失效、PDO异常、禁用函数和扩展缺失等8.3特有变化。

升级 PHP 8.3 后网站白屏,大概率不是代码“坏了”,而是错误被藏起来了——PHP 8.3 默认更严格、更沉默,不报错、不提示、只终止,页面就剩一片空白。关键不是猜问题,而是让错误自己说出来。
第一步:确认错误是否真被屏蔽
PHP 8.3 默认关闭 display_errors,且部分致命错误(如语法错、扩展缺失)在脚本加载前就发生,ini_set() 根本来不及执行。所以别只在入口文件加三行,得先确保底层开关已打开:
- 用
phpinfo()页面查 “Loaded Configuration File”,定位真实生效的php.ini - 检查并修改以下四项(必须全部设对):
display_errors = Onerror_reporting = E_ALLlog_errors = Onerror_log = /www/wwwlogs/php_error.log(宝塔常用路径;Linux 下确保该目录可写) - 改完立即重启 PHP-FPM 和 Web 服务(Nginx/Apache),否则配置不生效
第二步:直奔错误日志看原始线索
白屏时浏览器看不到错误,但日志不会撒谎。优先查两个地方:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
PHP 错误日志:就是上面
error_log指定的文件,比如/www/wwwlogs/php_error.log。常见线索包括:
•Parse error: syntax error, unexpected '}'(语法错,8.3 对括号/分号更敏感)
•Uncaught Error: Call to undefined function mb_strlen()(扩展没启用)
•Uncaught TypeError: strlen(): Argument #1 ($string) must be of type string(8.3 类型校验变严) -
Web 服务器日志:
Nginx:查看/var/log/nginx/error.log,留意FastCGI sent in stderr或connect() failed类提示
Apache:查看/var/log/apache2/error.log,常出现PHP Fatal error的完整堆栈
第三步:绕过框架干扰,暴露原始报错
WordPress、ThinkPHP 等框架自带错误处理器,会把致命错误转成 500 页面或静默吞掉。要看到 PHP 原生错误,得临时“卸掉”它们:
立即学习“PHP免费学习笔记(深入)”;
-
WordPress:在
wp-config.php顶部加三行(放在define('WP_DEBUG', true)之前):error_reporting(E_ALL);ini_set('display_errors', '1');ini_set('display_startup_errors', '1'); -
ThinkPHP:打开
public/index.php,注释掉这行:// think\initializer\Error::register();
并确认APP_DEBUG = true且未自定义exception_handle - 再建一个最简测试页
test.php(内容仅<?php phpinfo(); ?>),访问它。若它也白屏,说明是环境级问题(如扩展缺失、权限错误);若它正常,则问题在你的应用代码或框架配置
第四步:重点排查 PHP 8.3 特有变化
有些白屏根本原因,是 PHP 8.3 自身行为变了:
-
@ 错误抑制符失效:以前用
@mysql_connect()压着的致命错误,现在直接抛出,脚本中断。建议全面搜索代码中的@,改用try/catch显式处理 -
PDO 默认抛异常:
new PDO()连接失败不再返回false,而是直接throw PDOException。若没捕获,页面立刻白屏。务必在初始化后加:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); -
函数被禁用:检查
php.ini中disable_functions是否禁了chmod、file_get_contents等,WordPress 更新失败常因这个 -
扩展未启用:PHP 8.3 需手动启用
extension=mysqli、extension=pdo_mysql、extension=mbstring,且确认extension_dir指向新版 ext 目录(如/www/server/php/83/lib/php/extensions/no-debug-non-zts-20230831/)


















