PHP版本不兼容是页面空白的主因,需分别验证CLI与FPM版本,开启错误显示定位Fatal error,再通过系统工具或面板切换版本并确认Nginx正确连接新php-fpm。

页面空白大概率是 PHP 版本不兼容触发了致命错误,但错误被静默屏蔽了——不是代码挂了,是 PHP 拒绝执行且不告诉你原因。
检查是否因 PHP 版本导致的白屏
线上站点突然空白,第一反应不是改代码,而是确认当前实际运行的 PHP 版本和项目依赖是否匹配。比如 Laravel 10 要求 PHP >= 8.1,若服务器只装了 PHP 7.4,composer install 可能成功(因本地没校验),但运行时一碰到 mixed 类型声明或构造函数属性提升就直接 Fatal error,而默认配置下这类错误不会输出到页面。
- 通过 SSH 登录服务器,执行
php -v确认 CLI 使用的版本 - 新建一个
info.php放到 Web 根目录,内容为,用浏览器访问它,确认 Web Server(如 Nginx/Apache)加载的是哪个php-fpm实例及其版本 - 注意:CLI 和 FPM 的 PHP 版本可能不同,必须分别验证
让错误显示出来才能定位问题
白屏本质是错误被压制。在 php.ini 或项目入口(如 public/index.php)顶部临时开启错误报告:
如果此时出现具体错误(如
ParseError: syntax error, unexpected token "enum"),基本锁定是 PHP 版本过低(enum是 PHP 8.1+ 特性)。立即学习“PHP免费学习笔记(深入)”;
- 不要依赖
.htaccess开启错误(Apache 下有效,Nginx 不读它) - Nginx + PHP-FPM 场景下,必须修改对应 pool 的
php_admin_value[display_errors]或直接改全局php.ini - 上线前务必关掉
display_errors,改用log_errors记日志
快速切换 PHP 版本(以主流环境为例)
确认版本不匹配后,别重装整个环境,优先用现有工具切版本:
- Ubuntu/Debian +
apt安装多版本:用sudo update-alternatives --config php切 CLI;FPM 则需sudo systemctl disable php7.4-fpm && sudo systemctl enable php8.2-fpm && sudo systemctl restart php8.2-fpm nginx - CentOS/RHEL + EPEL:启用对应 SCL 或直接安装
php82-php-fpm包,修改 Nginx 的fastcgi_pass指向新 socket(如unix:/var/opt/rh/php82/run/php-fpm/www.sock) - 宝塔面板:在网站设置 → PHP 版本里直接下拉选择,但要注意「重启 PHP 服务」按钮是否真的生效(有时需手动点一次「重载配置」)
- 确认切换后,再次访问
info.php验证 FPM 版本已更新
部署流程中容易漏掉的 PHP 版本检查点
很多团队把版本检查放在最后一步,结果上线即白屏。真正要卡在三个位置:
- CI/CD 流水线的构建阶段:在
composer install前加php -v和php -m | grep opcache(有些扩展在新版里名变了) - 部署脚本开头:用
php -r "echo version_compare(PHP_VERSION, '8.1.0', '>=' ) ? 'OK' : 'FAIL';"做硬性校验,失败则中断部署 - Web 服务器配置模板里:Nginx 的
location ~ \.php$块中,fastcgi_pass必须显式写死 socket 路径或端口,不能靠系统 PATH 自动找——否则换 PHP 版本后它还在连旧的php-fpm
最麻烦的情况是:你以为切了 PHP 版本,但 Nginx 还在把请求发给旧的 php-fpm 进程,而那个进程因为配置文件残留或未重启,仍在运行。这时候 ps aux | grep php-fpm 和 ss -tlnp | grep :9000 比什么都管用。











