ubuntu 20.04 升级 php 8.1 后扩展失效,须重装对应 8.1 版本扩展包(如 php8.1-mbstring)、确认配置路径正确、启用模块并重启服务,否则 phpinfo() 和 php -m 均不显示且导致 500 或空白页。

Ubuntu 20.04 升级到 PHP 8.1 后,原有扩展(如 mbstring、curl、mysql、gd 等)不再生效,不是因为扩展“丢了”,而是它们仍指向旧版本(如 PHP 7.4)的二进制接口或配置路径。PHP 8.1 使用全新 Zend API 版本,所有扩展必须重新安装对应 8.1 的包,否则 php -m 不显示、phpinfo() 中缺失,甚至导致 Apache 返回空白页或 500 错误。
确认哪些扩展已丢失或未加载
先明确当前环境实际启用的扩展:
- 运行
php -m查看 CLI 模式下已加载的模块(注意:这不等于 Web 环境) - 创建
/var/www/html/test.php,内容为<?php phpinfo(); ?>,用浏览器访问,重点查看 “Loaded Configuration File” 路径(通常是/etc/php/8.1/apache2/php.ini)和 “Additional .ini files parsed” 列表 - 对比
php -i | grep "Scan this dir"输出,确认扩展配置是否被正确扫描(如/etc/php/8.1/apache2/conf.d/)
重装全部 PHP 8.1 扩展包(关键步骤)
Ubuntu 官方源或 Ondřej Surý PPA 中,每个扩展都按 PHP 主版本严格分离。PHP 7.4 的 php-mbstring 对 PHP 8.1 完全无效。必须显式安装带 8.1 后缀的包:
sudo apt install --reinstall php8.1-mbstring php8.1-curl php8.1-gd php8.1-xml php8.1-zip php8.1-bcmath php8.1-intl php8.1-opcache php8.1-mysql php8.1-pgsql php8.1-sqlite3- 若用 Apache + mod_php:确保同时安装
libapache2-mod-php8.1并启用模块:sudo a2enmod php8.1 - 若用 Nginx + PHP-FPM:安装
php8.1-fpm,并检查fastcgi_pass是否指向unix:/run/php/php8.1-fpm.sock
检查扩展配置文件是否启用
扩展安装后,需确认其 .ini 文件是否被 Apache 或 FPM 加载:
- 进入
/etc/php/8.1/apache2/conf.d/(Apache)或/etc/php/8.1/fpm/conf.d/(FPM),查看是否有20-mbstring.ini、20-curl.ini等软链接存在 - 若缺失,手动启用:
sudo phpenmod -v 8.1 mbstring curl gd(该命令会自动创建符号链接) - 注意:不要复制旧版(如 7.4)的
.ini文件到 8.1 目录——路径、参数可能已变更(例如extension=mbstring.so在 8.1 中仍有效,但某些第三方扩展需重编译)
验证与排错要点
重启服务后务必验证运行态,而非仅看安装日志:
- 重启对应服务:
sudo systemctl restart apache2(mod_php)或sudo systemctl restart php8.1-fpm nginx(FPM) - 立刻检查错误日志:
sudo tail -n 20 /var/log/apache2/error.log或sudo journalctl -u php8.1-fpm -n 20,常见报错如Unable to load dynamic library 'xxx'表示扩展依赖 DLL 或 so 文件路径错误 - 若扩展仍不显示,检查
extension_dir设置是否匹配:php -r "echo ini_get('extension_dir');"应返回类似/usr/lib/php/20210902(PHP 8.1 的 ABI 标识符),而非旧版路径 - 禁用冲突项:若曾启用
php8.1-fpm又同时启用了libapache2-mod-php8.1,二者互斥,必须二选一
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











