PHP连不上MySQL首要原因是mysqli或PDO_MySQL扩展未启用;需检查php.ini配置、确认CLI与Web环境使用同一配置文件、验证phpinfo()输出,并注意MySQL 8+认证插件兼容性问题。
mysqli 或 PDO_MySQL 扩展是否已启用绝大多数“PHP 无法连接 MySQL”的问题,根源不是配置错,而是扩展根本没加载。PHP 默认不自动启用 MySQL 相关扩展,必须手动开启。
php -m | grep -i mysql—— 应至少看到
mysqli 或 pdo_mysql(推荐两者都开)php.ini,取消注释这两行(去掉前面的分号):;extension=mysqli
;extension=pdo_mysql
sudo apt install php-mysql,然后重启 Web 服务(
sudo systemctl restart apache2 或 sudo systemctl restart php-fpm)phpinfo() 页面确认:搜索 “mysqli” 或 “PDO Driver for MySQL”,有输出才表示真正生效这是典型的扩展未启用或 PHP CLI 与 Web 使用了不同配置文件导致的错位问题。
php.ini:运行 php --ini查看 CLI 加载路径;在 Web 中用
phpinfo() 查看 Loaded Configuration FileDockerfile 中显式安装,例如:RUN docker-php-ext-install mysqli pdo pdo_mysql
php.in
i,还要确认它实际指向的是哪个文件(有时有多个副本)php.ini 中补全 extension_dir,例如:extension_dir = "/opt/homebrew/lib/php/pecl/20250829"
mysqli_connect() 连接失败的常见参数和调试要点函数本身不报错,但返回 false,必须配合 mysqli_connect_error() 获取真实原因。
$conn = mysqli_connect('127.0.0.1', 'user', 'pass', 'db_name', 3306);localhost:它会触发 Unix socket 连接,而容器或某些系统下 socket 文件路径不一致,改用 127.0.0.1 强制走 TCPcaching_sha2_password 认证插件,老版本 PHP(
if (!$conn) {
die('Connect Error: ' . mysqli_connect_error());
}网络通、端口映射对,但还是连不上——大概率是 DNS 解析或权限没设对。
--network mynet,并在 docker-compose.yml 中统一声明 networks
127.0.0.1 或 localhost,必须写 MySQL 服务名(如 mysql、db),这是 Docker 内置 DNS 提供的主机名my.cnf 中设置 bind-address = 0.0.0.0,并确保用户 host 是 % 而非 localhost
wait-for-it.sh 类脚本延迟启动,否则第一次连接必然失败php.ini 不一致,或者 Docker 下硬编码了 localhost。连之前,先跑一句 php -r "var_dump(function_exists('mysqli_connect'));",比猜快得多。