“connection refused”错误表明php未触及认证环节,主因是mysql服务未启动或3306端口未监听;需先执行sudo systemctl status mysql和ss -tlnp | grep :3306确认状态,再检查bind-address配置、防火墙/selinux、docker网络及云服务器安全组规则。

mysqli_connect() 报 “Connection refused” 先看服务和端口
这错误根本不是权限或密码问题,而是 PHP 根本没机会走到认证那步——连接请求被系统直接拒了。最可能的原因是 MySQL 没在监听 3306,或者压根没启动。
执行这两条命令确认基础状态:
sudo systemctl status mysql
ss -tlnp | grep :3306
如果 systemctl status 显示 inactive,先 sudo systemctl start mysql;如果 ss 没输出,说明 mysqld 没绑定端口,检查 /etc/mysql/my.cnf 或 /etc/my.cnf 里是否有 bind-address = 127.0.0.1(本地可用)或 bind-address = 0.0.0.0(远程需此),改完必须 sudo systemctl restart mysql。
防火墙/SELinux 拦住了,但你可能没意识到
即使 ss 显示 3306 在监听,firewalld 或 ufw 仍可能丢弃入站包。Docker 容器里连宿主机 MySQL 时,这个坑尤其隐蔽——PHP 容器里的 localhost 指向自己,不是宿主机。
- 临时关闭验证:运行
sudo setenforce 0(SELinux)或sudo ufw disable(Ubuntu) - Docker 场景下,PHP 连接串 host 别写
localhost,改用host.docker.internal(Docker Desktop)或宿主机真实 IP(Linux Docker) - 云服务器务必检查安全组,3306 入方向规则要显式放行,来源不能只填
127.0.0.1
用户权限不是“有没有”,而是“从哪儿来”
Access denied for user 和 Connection refused 是两类错误,但新手常混淆。前者是认证通过后被拦,后者连握手都没完成。不过一旦确认连接通了,下一步就该核对 user@host 组合。
登录 MySQL 后执行:
SELECT User, Host FROM mysql.user WHERE User = 'your_user';
若返回结果是 'your_user'@'localhost',但 PHP 用的是 127.0.0.1,MySQL 就当它是另一个账号——因为 localhost 走 socket,127.0.0.1 走 TCP,权限记录不互通。
- 修复方式:创建明确 host 的用户,例如
CREATE USER 'app'@'127.0.0.1' IDENTIFIED BY 'pwd'; - 授权时别用
GRANT ALL ON *.*,最小化范围:GRANT SELECT,INSERT ON mydb.* TO 'app'@'127.0.0.1'; - 执行完必须
FLUSH PRIVILEGES;,否则不生效
PHP 8.1 下 mysqli 扩展和认证插件要对得上
PHP 8.1 默认编译带 mysqlnd,支持 caching_sha2_password,但如果你用的是旧版 MySQL 镜像、或手动降级过认证插件,又或者 PHP 是源码编译未启用 SSL 支持,仍可能在连接时静默失败。
查当前用户用的插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
若 plugin 是 caching_sha2_password,而你怀疑驱动兼容性,可在连接前加一行强制指定协议:
$conn = mysqli_connect('127.0.0.1', 'root', 'pass', 'test');<br>mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 5);
更稳妥的做法是统一用 mysql_native_password 插件:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';<br>FLUSH PRIVILEGES;
注意:改完插件后,PHP 代码里 mysqli_connect() 的返回值一定要检查,加 if (!$conn) die(mysqli_connect_error());,否则白屏什么也看不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











