PHP版本升级后404本质是Web服务器未将请求转发至对应PHP处理器,需依次排查PHP-FPM服务状态、fastcgi_pass路径匹配、socket权限、模块加载及扩展兼容性,四者任一错位即导致管道中断而返回404。

直接换回旧版本不能解决问题,必须定位是哪一层不匹配——PHP本身、Web服务器模块、FPM服务配置、扩展加载顺序,四者任一错位都会让网站彻底不可用。
PHP-FPM服务没连上,Nginx/Apache返回404
PHP不处理请求,Web服务器就当.php文件不存在,自然404。这不是代码问题,是管道断了。
- 运行
systemctl list-units | grep fpm,确认你切换的PHP版本对应的服务名是否在运行(如php8.2-fpm而不是php7.4-fpm) - 检查Nginx的
fastcgi_pass是否指向正确的socket路径,例如unix:/run/php/php8.2-fpm.sock,路径必须和/etc/php/8.2/fpm/pool.d/www.conf里的listen完全一致 - 用
curl --unix-socket /run/php/php8.2-fpm.sock http://localhost/status测试能否连通FPM状态页(需先在www.conf中启用pm.status_path = /status) - 如果报
Permission denied,检查www.conf的user和group是否与Nginx/Apache运行用户(如www-data)一致,且socket文件权限为srw-rw----
PHP模块加载失败或扩展缺失,报Fatal error
函数未定义、类找不到、require 失败,基本都是扩展没装对或没启对。
- 执行
php -m,确认mysqli、pdo_mysql、mbstring、json等核心扩展都在列表里;缺哪个就用包管理器装,比如 Debian 上apt install php8.2-mbstring - 若用PECL装过扩展(如
redis或swoole),必须重装:先pecl uninstall redis,再pecl install redis,否则.so文件是为旧PHP编译的,加载会失败 - 多个PHP版本共存时,
/etc/php/*/cli/conf.d/下的ini文件可能被重复加载,把非目标版本的扩展ini临时重命名为20-redis.ini.bak排查 - 某些扩展(如
opcache)在PHP 8.2+要求opcache.enable_cli=1才能在CLI下生效,否则php -v都可能卡住
php.ini配置项被静默禁用,页面空白但无报错
不是代码错了,是错误根本没显示出来,或者被PHP直接拒之门外。
立即学习“PHP免费学习笔记(深入)”;
- 检查
short_open_tag:PHP 8.0+默认Off,如果代码里大量用而非<?php,整段脚本会被当纯文本跳过,结果就是白屏 - 确认
display_errors = Off且log_errors = On是常见组合,此时错误只写日志不输出——用tail -f $(php --ini | grep "Loaded Configuration File" | cut -d' ' -f4 | xargs dirname)/../logs/php_errors.log实时盯日志 -
memory_limit在PHP 8.2中默认值可能比7.4低,大数组或ORM查询容易触发Fatal error: Allowed memory size exhausted,临时调高到256M快速验证 - PHP 8.1+ 强制要求
date.timezone显式设置,否则部分日期函数(如date())会抛Warning并中断执行
Apache没加载新模块,浏览器直接下载.php源码
这是最典型的“没接上”现象:Web服务器压根不知道该把.php交给谁处理。
- 运行
a2enmod php8.2(Debian/Ubuntu)或确认httpd -M | grep php输出含php8_module,不是php7_module - 检查Apache站点配置中是否有
<filesmatch></filesmatch>块,且SetHandler值是application/x-httpd-php(PHP 8.x去掉了版本号后缀,写成application/x-httpd-php8会失效) - 如果用了
.htaccess,确认主配置中AllowOverride All已启用,否则php_flag类指令不生效 - 重启顺序不能错:
systemctl restart php8.2-fpm→systemctl restart apache2,颠倒可能导致Apache拿到一个未就绪的FPM socket
多版本共存环境下,最容易被忽略的是 php --ini 和 phpinfo() 显示的配置路径不一致——CLI用一套,Web SAPI用另一套。务必分别验证两者下的 extension_dir、error_log 和已加载模块。



















