connection refused 表示php尝试连接mysql时根本未建立tcp连接,原因包括mysql未监听指定端口、bind-address配置不当(如仅限127.0.0.1)、防火墙拦截、或phpenv中误用localhost导致走socket而非tcp;需通过netstat/ss检查监听状态,将bind-address设为0.0.0.0并重启mysql,php代码中host显式写127.0.0.1,并用nc验证连通性。

Connection refused 错误说明什么
这表示 PHP 尝试用 TCP 向数据库服务器发起连接,但目标地址+端口上没有服务在监听,或者被中间设备(如防火墙、安全组)直接拒绝。它和 Access denied、Unknown MySQL server host 有本质区别——后者是“连上了但被拒”,而 Connection refused 是“根本没连上”。
检查 MySQL 是否监听 3306(或你指定的端口)
运行以下命令确认 MySQL 进程是否真正在监听外部连接:
-
netstat -tuln | grep :3306—— 如果无输出,说明 MySQL 没绑定该端口 -
ss -tuln | grep :3306—— 更现代的替代命令 -
lsof -i :3306—— macOS 或已安装 lsof 的系统可用
关键看输出中 LISTEN 行的 Address 列:若显示 127.0.0.1:3306 或 localhost:3306,则只接受本地回环连接;若要允许 phpEnv(或其他远程客户端)连接,必须看到 *:3306 或具体 IP(如 0.0.0.0:3306)。
修改方法:编辑 MySQL 配置文件(通常是 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf),找到 bind-address 行,改为:
bind-address = 0.0.0.0
然后重启服务:sudo systemctl restart mysql。
phpEnv 环境下特别注意 host 值
phpEnv 默认使用 localhost 作为数据库 host,但在多数 Linux 发行版中,localhost 会强制走 Unix socket 而非 TCP,而 MySQL 若配置了 bind-address = 0.0.0.0 却未启用 socket,就会导致 Connection refused(因为 socket 文件路径不匹配或未生成)。
解决办法是:在 phpEnv 的数据库配置中,把 host 显式改成 127.0.0.1,例如:
$conn = mysqli_connect('127.0.0.1', 'root', 'pass', 'test');
这样能确保走 TCP 连接,与 MySQL 的 bind-address 设置对齐。不要依赖 localhost 自动降级行为——它不可靠,且不同 PHP 版本/系统表现不一致。
验证网络层是否通,绕过 PHP 直接测
在 phpEnv 所在机器上执行:
-
nc -zv 127.0.0.1 3306(推荐,无需安装 telnet) -
telnet 127.0.0.1 3306(若已安装)
如果返回 Connection refused,说明 MySQL 根本没监听该端口或 bind-address 不匹配;如果卡住或超时,则可能是防火墙拦截(如 ufw、iptables、云平台安全组);只有返回 Connected to 127.0.0.1 才算真正通了。
注意:phpEnv 本身不改变网络栈,但它常运行在 Docker 或 WSL 中——此时需额外确认容器端口映射(-p 3306:3306)或 WSL2 的 IP 可达性,不能只查宿主机 localhost。
最易忽略的一点:MySQL 服务起来了,bind-address 改了,127.0.0.1 也用了,但忘记重启 MySQL 服务——所有改动都白做。每次改完配置,务必执行 systemctl restart mysql 并用 netstat 和 nc 双重验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











