connection refused 表明 mysql 服务未监听指定端口或网络不可达,需先确认 mysqld 进程运行状态(systemctl status mysql)和端口监听情况(netstat -tuln | grep :3306),再检查 bind-address、skip-networking 配置及 thinkphp 的 hostname、hostport 类型是否正确。

“Connection refused”不是 ThinkPHP 报的,是操作系统或 MySQL 服务直接拒了 socket 连接——说明服务没在监听,或者监听地址/端口根本对不上。
看到 Connection refused 就该先查服务和网络
别急着改 database.php。这个错误发生在 PHP 尝试建立 TCP 连接时,内核或 MySQL 进程直接返回 RST 包,连认证环节都进不去。
必须分两步确认:
- MySQL 进程是否活着:
systemctl status mysqld(CentOS)或systemctl status mysql(Ubuntu),不是“启动了”就行,得看active (running) - 端口是否真在监听:
netstat -tuln | grep :3306,如果没输出,说明 MySQL 没绑定 TCP;再检查配置里bind-address = 127.0.0.1和skip-networking = OFF是否启用 - 本地能否通:
mysql -h 127.0.0.1 -P 3306 -u root -p—— 注意必须加-h 127.0.0.1,用localhost会走 socket,跟 ThinkPHP 配置的 TCP 路径不一致 - Docker 环境下,
hostname别写127.0.0.1:容器内访问宿主机要用host.docker.internal(Mac/Win)或宿主机真实 IP(Linux)
ThinkPHP 的 hostname、port、password 容易写错
配置项名、类型、特殊字符这三点,错一个就静默 fallback 到默认值,然后连到 127.0.0.1:3306 或直接失败。
-
hostname是唯一合法字段名,写成host、host_name或server都会被忽略 -
hostport(TP5.1+)或port(TP5.0)必须是整数,不能是字符串"3306"—— PHP 类型转换后可能变成 0,PDO 就连到默认端口(通常是 3306,但不可靠) -
password含@、/、:等字符时,若用 DSN 格式(如mysql://user:pass@host/db)会解析错位;一律改用数组配置方式
正确示例:
'mysql' => [
'type' => 'mysql',
'hostname' => '192.168.1.100',
'hostport' => 3306,
'database' => 'test',
'username' => 'app_user',
'password' => 'p@ss/w0rd!',
],
env 文件没生效?三个硬性条件缺一不可
.env 不是“写了就能用”,ThinkPHP 5.1+ 只在满足全部条件时才加载:
- 文件必须放在项目根目录(和
think命令同级),不是config/或application/下 -
APP_DEBUG必须为true,否则环境变量加载逻辑被跳过(这是最常被忽略的一点) - 键名必须全大写 + 下划线:
DB_HOST=127.0.0.1才有效,db_host或Db_Host都读不到
验证是否生效,控制器里临时加一行:dump(env('DB_HOST'));,输出 null 就说明上面至少一条没满足。
报错里带 caching_sha2_password 就是 MySQL 8.0 认证插件不兼容
错误信息是:Authentication plugin 'caching_sha2_password' cannot be loaded。这不是密码错了,是 PHP 7.4 以下版本的 PDO 扩展压根不支持这个插件。
- 别降级 MySQL,改用户认证方式更稳妥
- 登录 MySQL 后执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 注意:必须指定
@'%'或@'127.0.0.1',跟 PHP 连接时用的hostname严格一致 - 执行完记得
FLUSH PRIVILEGES;
如果用的是云数据库(如阿里云 RDS),控制台通常提供“修改认证方式”开关,比命令行更直接。
Connection refused 看似简单,但背后可能是服务未监听、Docker 网络错位、env 加载失败、MySQL 8.0 插件不兼容等完全不同的问题。关键不是“怎么改配置”,而是先用 mysql -h 127.0.0.1 -P 3306 -u ... 和 netstat 把底层连通性钉死,再一层层往上排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











