PHP 版本升级后 mysqli 扩展无法加载,通常是因为新版本的 PHP 需要重新安装或启用对应的扩展包。最推荐的处理方向是根据新 PHP 版本安装匹配的 php-mysqli 扩展,并在 php.ini 中启用,注意区分 CLI 和 FPM 的配置文件路径。
先说结论:升级 PHP 后扩展丢失属于预期行为,需通过包管理器重装扩展并重启服务。
- 先确认:当前 PHP 版本号和 php.ini 配置文件路径
- 先处理:使用包管理器安装对应版本的 php-mysqli 扩展包
- 再验证:执行 php -m 命令检查扩展列表是否包含 mysqli
命令速用版
根据操作系统包管理器选择对应命令,安装完成后需重启 Web 服务。
# Ubuntu/Debian 系统
sudo apt install php-mysqli
# CentOS/RHEL 系统
sudo yum install php-mysqli
# 重启 PHP-FPM
sudo systemctl restart php-fpm
# 重启 Nginx/Apache
sudo systemctl restart nginx
sudo systemctl restart httpd为什么会这样
PHP 扩展模块与 PHP 核心版本存在二进制兼容性依赖,升级核心后旧扩展无法加载。
PHP 的扩展模块(Extension)在编译时依赖于特定版本的 PHP 内部 API(Zend API)。当 PHP 主版本升级(例如从 7.4 到 8.0)时,内部结构发生变化,旧版本的扩展二进制文件不再兼容。此外,Linux 发行版的软件包策略通常将 PHP 核心与扩展分开打包,升级 php 包不会自动升级 php-mysqli 包,导致扩展缺失。
分步处理
按顺序执行版本检查、扩展安装、配置启用和服务重启,每步完成后检查状态。
步骤 1:确认 PHP 版本和配置文件路径
执行命令查看当前 CLI 和 Web 环境的 PHP 版本及加载的 ini 文件路径,避免配置错位置。
php -v
php `--ini`步骤 2:安装匹配的 mysqli 扩展
使用系统包管理器安装与当前 PHP 版本匹配的扩展包,包名通常包含版本号。
# 示例:PHP 8.1
sudo apt install php8.1-mysqli步骤 3:检查 php.ini 配置
确认扩展已在配置文件中启用,部分系统默认启用,部分需手动添加 extension=mysqli。
grep -i mysqli /etc/php/8.1/cli/php.ini
grep -i mysqli /etc/php/8.1/fpm/php.ini步骤 4:重启服务
修改配置或安装扩展后,必须重启 PHP-FPM 或 Web 服务器才能生效。
怎么验证是否生效
通过命令行模块列表和 phpinfo 页面双重验证,确保 CLI 和 Web 环境均加载成功。
命令行验证:
php -m | grep mysqli输出中包含 mysqli 字样即表示 CLI 环境加载成功。
Web 环境验证:
创建包含<?php phpinfo(); ?>的测试页面,在浏览器访问并搜索 mysqli 字段,确认扩展状态为 enabled。
常见坑
多版本共存时容易配错路径,权限不足会导致重启失败,需仔细核对。
- 多版本冲突:服务器同时存在 PHP 7.4 和 8.0 时,确保安装的是 8.0 对应的扩展包,配置文件路径也不同
- CLI 与 FPM 不一致:命令行正常但网页报错,通常是因为只修改了 CLI 的 php.ini 而忽略了 FPM 的配置
- 权限问题:手动编译扩展时,若文件归属权不是 www-data,可能导致 Web 服务无法读取
常见问题
mysqli 和 mysql 扩展有什么区别?
mysql 扩展已在 PHP 7.0 移除,必须使用 mysqli 或 PDO_MySQL。
安装后 php -m 仍然看不到 mysqli 怎么办?
检查是否编辑了错误的 php.ini 文件,或存在多个 php.ini 配置文件优先级冲突。
源码编译安装 PHP 后如何添加 mysqli?
需重新编译 PHP 或使用 docker-php-ext-install 命令,包管理器命令对源码安装无效。
参考来源
- PHP Official Documentation - MySQLi Installation: https://www.php.net/manual/en/mysqli.installation.php
- Ubuntu Documentation - PHP Packages
- CentOS Documentation - PHP Module