mysqli_connect() 返回 false 时应立即调用 mysqli_connect_error() 获取具体错误;常见原因包括服务未启动、认证失败、DNS解析错误或 host 配置不当,PDO 则需启用异常模式并注意密码编码与认证插件兼容性。

mysqli_connect() 返回 false 怎么查具体原因
直接用 mysqli_connect_error() 拿错误字符串,别只写 die('连接失败') —— 它不告诉你错在哪。
-
Connection refused:MySQL 没启动、端口不对,或绑定了127.0.0.1却用localhost连(触发 socket 而非 TCP) -
Access denied for user:用户名/密码错,或用户是'user'@'localhost',但 PHP 运行在 Docker 容器里,实际来源 IP 是172.18.0.3 -
Unknown MySQL server host:DNS 解析失败,或DB_HOST拼错成localhsot这类低级错误
实操建议:在 mysqli_connect() 后立刻加判断:
if (!$conn) {
die('连接失败: ' . mysqli_connect_error());
}
PDO 连接失败时如何拿到真实错误信息
默认 PDO 会静默失败,必须手动开启异常模式,否则 new PDO() 抛出的只是通用 Exception,看不出是认证失败还是网络不通。
- 在
PDO构造后立即设置:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) - 或者初始化时传入选项:
new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]) -
DB_PASSWORD含@、/、:等字符时,必须 URL 编码再拼进 DSN,否则解析直接中断
例如密码是 p@ss/w0rd,DSN 中得写成 mysql:host=localhost;dbname=test;charset=utf8mb4 + &password=p%40ss%2Fw0rd
立即学习“PHP免费学习笔记(深入)”;
PHP 8.5.5 下 MySQL 8.0+ 认证插件不兼容咋办
Laravel 或原生 PDO 连 MySQL 8.0+ 时,如果用户用的是默认 caching_sha2_password 插件,PHP 8.5.5(尤其没装 openssl 扩展时)可能静默失败,报错像 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client。
- 临时解法:在 MySQL 里执行
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 长期方案:升级到 PHP 8.5.5 + OpenSSL 3.0+,并确认
pdo_mysql编译时启用了 SSL 支持 - Docker 镜像中容易漏掉:Alpine 需
apk add php82-openssl(版本号要和 PHP 主版本一致)
连接池耗尽或空闲断连怎么防
开发时好好的,上线几分钟后开始报 Connection refused 或 MySQL server has gone away,大概率不是配置问题,而是连接没释放或被中间设备(云 RDS、Nginx、防火墙)主动断开。
- 检查 MySQL 的
wait_timeout(阿里云 RDS 默认 300 秒),框架里配PDO::ATTR_TIMEOUT不够,得加PDO::ATTR_PERSISTENT => false避免长连接堆积 - 循环里别反复
new PDO(),用单例或连接池管理;对象 unset 前调用$pdo = null,让连接真正关闭 - PHP-FPM 场景下,注意
pm.max_children和 MySQL 的max_connections匹配,前者超了后者就拒绝新连
最常被忽略的是:本地测试用 localhost 没问题,一上容器或云服务,host 必须换 127.0.0.1 或真实内网 IP,否则 DNS 或 socket 路径根本走不通。



















