MySQL连接被拒绝(错误2002)的根本原因是服务未运行、端口不通或配置错误,需优先检查服务状态、网络连通性及host配置(如localhost与127.0.0.1差异),而非修改密码或SQL代码。
![php sqlstate[hy000] [2002] connection refused 怎么处理](https://img.php.cn/upload/article/001/431/639/178817893642694.png)
这不是密码错或库名错,是根本连不上 MySQL 服务端——先确认服务在跑、端口通、配置对,再调代码。
MySQL 服务没起来是最常见原因
错误 SQLSTATE[HY000] [2002] Connection refused 表示 PHP 尝试建立 TCP 连接时被直接拒绝,连握手都没开始。第一反应不是改代码,而是查服务本身是否存活:
- Linux 下执行
systemctl status mysql或systemctl status mysqld,看状态是不是active (running) - Windows 下打开
services.msc,找 “MySQL” 或 “MySQL80”,确认状态为“正在运行” - 如果服务停了,Linux 执行
sudo systemctl start mysql;Windows 右键启动服务 - 服务刚启但还没完全就绪(尤其容器场景),等 5–10 秒再试,别立刻刷新页面
localhost 和 127.0.0.1 在 PHP PDO 里行为不同
PHP 的 PDO MySQL 驱动对 localhost 有特殊处理:默认走 Unix socket(如 /var/run/mysqld/mysqld.sock),而 127.0.0.1 强制走 TCP。当 socket 文件路径不对或权限不足时,localhost 就会报 No such file or directory 或直接 Connection refused:
- 把数据库配置里的
'host' => 'localhost'换成'host' => '127.0.0.1',绕过 socket 路径问题 - 如果必须用
localhost,需确认mysql.sock实际路径(查mysql --socket或SHOW VARIABLES LIKE 'socket';),并在 PDO DSN 中显式指定:mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=test - Docker 容器内 PHP 连宿主机 MySQL 时,
127.0.0.1指的是容器自己,必须用宿主机真实 IP(如172.17.0.1)或host.docker.internal(Docker Desktop)
Docker 环境下 MySQL 容器没暴露端口或网络不通
PHP 和 MySQL 分处两个容器时,Connection refused 多半是网络层没打通:
立即学习“PHP免费学习笔记(深入)”;
- 检查 MySQL 容器是否绑定了正确地址:进容器执行
cat /etc/mysql/mysql.conf.d/mysqld.cnf,确认bind-address = 0.0.0.0(不是127.0.0.1) - 检查
docker run是否加了-p 3306:3306,或docker-compose.yml中ports:是否声明;没映射端口,外部肯定连不上 - PHP 容器连接 MySQL 容器时,
host必须填 MySQL 容器名(如mysql),不能填localhost或127.0.0.1—— 同一 Docker 网络下靠容器名 DNS 解析 - 用
docker network inspect your_network_name确认两容器是否在同一个自定义网络里;默认bridge网络不支持容器名解析
防火墙、SELinux 或云服务器安全组拦住了 3306
即使服务在跑、配置也对,TCP 层也可能被中间设备拦截:
- Linux 上临时关防火墙测试:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(CentOS) - 云服务器(阿里云/腾讯云)必须去控制台检查“安全组规则”,放行入方向的
TCP:3306,源 IP 填0.0.0.0/0或 PHP 所在机器 IP - SELinux 启用时可能阻止网络连接,临时禁用测试:
sudo setenforce 0 - 用
telnet 127.0.0.1 3306或nc -zv 127.0.0.1 3306直接测端口是否可通;不通就说明卡在服务、防火墙或配置层,和 PHP 无关
真正麻烦的不是连不上,而是连不上时你还在改 username 或 password —— 这类参数错报的是 SQLSTATE[HY000] [1045]。只要看到 [2002],就该立刻切到服务状态、网络通路、配置地址这三层去验证,别陷进代码逻辑里。



















