connection refused 或 unknown mysql server host 表示网络层未连通,应先用 mysql -h 127.0.0.1 -p 3306 -u root -p 验证服务状态、端口监听及 dns 解析,再排查防火墙、安全组或容器网络配置。

绝大多数 PHP 数据库连接失败,根本没走到 SQL 执行阶段,而是卡在连接建立前的环境、参数或权限层。 直接看错误信息里的关键词,比重写代码更快定位问题。
Connection refused 或 Unknown MySQL server host 怎么办
这是网络层断开,PHP 连不到 MySQL 进程本身。
- 先执行
mysql -h 127.0.0.1 -P 3306 -u root -p—— 用127.0.0.1(不是localhost)绕过 socket 差异,能进就说明服务在跑、端口通 - 如果报
Connection refused:检查systemctl status mysql是否 active;再查netstat -tuln | grep :3306看是否 LISTEN;云服务器还要确认安全组放行了 3306 - 如果报
Unknown MySQL server host 'mysql':Docker 环境里填错了容器名,或 Alpine 镜像缺resolvconf导致 DNS 解析失败
Access denied for user 错在哪
账号密码对不上,或者 MySQL 认为你“不是它允许的人”。
- 执行
SELECT User, Host FROM mysql.user;,重点看你要用的用户(比如app_user)的Host字段是不是%、127.0.0.1或具体 IP ——'app_user'@'localhost'和'app_user'@'127.0.0.1'在 MySQL 里是两个不同账户 - 密码含
@、/、:等字符时,PDO DSN 中必须 URL 编码,例如pass@word→pass%40word;mysqli_connect() 不需要编码,但传参时别被 shell 吃掉空格 - MySQL 8.0+ 默认用
caching_sha2_password插件,PHP 7.4 以下不认 —— 登录 MySQL 后执行:ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;
pdo_mysql 扩展没启用或版本错
哪怕参数全对,扩展没开也白搭;开了但版本不匹配,照样静默失败。
- 运行
php -m | grep -i pdo,确认输出里同时有pdo和pdo_mysql;Docker Alpine 镜像常漏装,得补apk add php82-pdo_mysql(版本号要和当前 PHP 一致) - Laravel 10+ 要求 PHP ≥ 8.1,若你用 PHP 7.4 连 MySQL 8.0+,大概率因认证插件不兼容而卡住,不是报错而是超时或空响应
- 别只信
phpinfo()页面——CLI 和 Web SAPI 的 php.ini 可能不同,用php --ini确认 CLI 加载的是哪个配置文件
连得上但隔几分钟就断,或本地通线上不通
不是配错了,是连接被中间设备或配置策略主动掐断。
- MySQL 的
wait_timeout默认 28800 秒(8 小时),但阿里云 RDS 常设为 300 秒;框架没设PDO::ATTR_TIMEOUT,空闲连接会被服务端先断,下次用就崩 - 检查是否在循环里反复
new PDO()却没$pdo = null—— PDO 实例不会自动 close,长连接会撑爆 MySQL 的max_connections - 宝塔面板或 CentOS 7+ 上 SELinux 默认开启,可能拦截 PHP-FPM 到 MySQL 的连接,临时关掉测试:
setenforce 0
真正难缠的不是报错,而是没报错却连不上——这时候得盯住错误日志级别、PDO 异常模式是否开启、以及 CLI 和 Web 环境是否用了同一套配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











