PHP连不上MySQL首要原因是mysqli或PDO_MySQL扩展未启用;需检查php.ini配置、确认CLI与Web环境使用同一配置文件、验证phpinfo()输出,并注意MySQL 8+认证插件兼容性问题。

PHP 为什么连不上 MySQL?先确认 mysqli 或 PDO_MySQL 扩展是否已启用
绝大多数“PHP 无法连接 MySQL”的问题,根源不是配置错,而是扩展根本没加载。PHP 默认不自动启用 MySQL 相关扩展,必须手动开启。
- 检查当前启用的扩展:
php -m | grep -i mysql
—— 应至少看到mysqli或pdo_mysql(推荐两者都开) - Windows 用户:打开
php.ini,取消注释这两行(去掉前面的分号):;extension=mysqli
;extension=pdo_mysql - Linux/macOS(如通过 apt 或 brew 安装):通常需单独安装包,例如 Ubuntu 上运行
sudo apt install php-mysql
,然后重启 Web 服务(sudo systemctl restart apache2或sudo systemctl restart php-fpm) - 用
phpinfo()页面确认:搜索 “mysqli” 或 “PDO Driver for MySQL”,有输出才表示真正生效
连接 MySQL 时提示 “Class 'mysqli' not found” 或 “Driver not found” 怎么办
这是典型的扩展未启用或 PHP CLI 与 Web 使用了不同配置文件导致的错位问题。
- CLI 和 Web 环境可能使用不同的
php.ini:运行php --ini
查看 CLI 加载路径;在 Web 中用phpinfo()查看 Loaded Configuration File - 常见陷阱:Docker 中 PHP 镜像默认不含 MySQL 扩展,需在
Dockerfile中显式安装,例如:RUN docker-php-ext-install mysqli pdo pdo_mysql
- 如果用了 XAMPP/MAMP,不要只改界面里显示的
php.ini,还要确认它实际指向的是哪个文件(有时有多个副本) - Mac 上用 Homebrew 安装 PHP 后,扩展目录可能不在默认路径,需在
php.ini中补全extension_dir,例如:extension_dir = "/opt/homebrew/lib/php/pecl/20220829"
mysqli_connect() 连接失败的常见参数和调试要点
函数本身不报错,但返回 false,必须配合 mysqli_connect_error() 获取真实原因。
- 基础调用格式(不推荐省略端口,尤其 Docker 或非标准部署):
$conn = mysqli_connect('127.0.0.1', 'user', 'pass', 'db_name', 3306); - 避免用
localhost:它会触发 Unix socket 连接,而容器或某些系统下 socket 文件路径不一致,改用127.0.0.1强制走 TCP - MySQL 8+ 默认用
caching_sha2_password认证插件,老版本 PHP( - 连接后立即检查错误:
if (!$conn) {
die('Connect Error: ' . mysqli_connect_error());
}
Docker 环境中 PHP 容器连不上 MySQL 容器的典型配置漏项
网络通、端口映射对,但还是连不上——大概率是 DNS 解析或权限没设对。
立即学习“PHP免费学习笔记(深入)”;
- 确保两个容器在同一个自定义网络(不要依赖默认 bridge),例如启动时加
--network mynet,并在docker-compose.yml中统一声明networks - PHP 中连接地址不能写
127.0.0.1或localhost,必须写 MySQL 服务名(如mysql、db),这是 Docker 内置 DNS 提供的主机名 - MySQL 容器必须允许远程连接:在
my.cnf中设置bind-address = 0.0.0.0,并确保用户 host 是%而非localhost - PHP 容器启动时机早于 MySQL 容器就绪:加健康检查或用
wait-for-it.sh类脚本延迟启动,否则第一次连接必然失败
php.ini 不一致,或者 Docker 下硬编码了 localhost。连之前,先跑一句 php -r "var_dump(function_exists('mysqli_connect'));",比猜快得多。











