connection refused 错误是操作系统或服务端拒绝 php socket 连接,因 redis/mysql 未运行、未监听或地址端口错误;需先确认服务状态与网络连通性,再检查 thinkphp 配置项(hostname、port 类型、password 特殊字符)、mysql 连接数限制及 docker 网络配置。

Connection refused 错误到底在拒绝谁
这个错误不是框架报的,是 PHP 底层 socket 连接被操作系统或服务端直接拒了——Redis 或 MySQL 服务根本没在监听,或者监听了但地址/端口不对。ThinkPHP 只是把底层 PDO 或 Redis 扩展抛出的原始错误透传出来。
先别急着改配置,分两步确认:服务是否运行、网络是否通。
- 执行
ps aux | grep mysql或systemctl status mysqld(Linux)确认 MySQL 进程活着;redis-cli ping能返回PONG才算 Redis 活着 - 用
telnet 127.0.0.1 6379或nc -zv 127.0.0.1 3306测试端口连通性——如果连不上,Connection refused就是必然结果 - 注意:Docker 容器内访问宿主机
127.0.0.1是错的,得用host.docker.internal(Mac/Win)或宿主机真实 IP(Linux)
ThinkPHP 配置里最容易写错的三个地方
配置文件(如 database.php 或 cache.php)里几个字段看似简单,但拼错一个字母就连接失败。
-
hostname写成host或host_name:ThinkPHP 只认hostname,其他字段名会被忽略,退化为默认值127.0.0.1 -
port类型必须是整数,不能是字符串"6379"——PHP 强类型转换下可能变成 0,导致连到错误端口 -
password包含特殊字符(如@、/)时,Redis 的 DSN 格式(redis://:pass@host:port)会解析失败;建议统一用数组配置而非 DSN
示例(正确):
'redis' => [
'hostname' => '192.168.1.100',
'port' => 6379,
'password' => 'my@p4ss!',
],
MySQL 的 max_connections 和 wait_timeout 偶发触发 Connection refused
看起来服务正常、配置也没错,但高峰期突然报 Connection refused?大概率是 MySQL 主动拒绝新连接,而不是网络层拒绝。
-
max_connections被打满后,新连接请求会被内核丢弃,表现就是Connection refused(不是Too many connections) -
wait_timeout太短(如设为 10),空闲连接被 MySQL 主动断开,而 ThinkPHP 的连接池没及时检测,下次复用时就会遇到连接已失效 - 检查当前连接数:
SHOW STATUS LIKE 'Threads_connected';,对比SHOW VARIABLES LIKE 'max_connections';
临时缓解可调高 max_connections,但更关键是排查长连接未释放、查询未加索引导致慢查询堆积等问题。
Docker 环境下容器间网络不通的典型表现
本地开发用 Docker Compose 启 MySQL/Redis,ThinkPHP 容器死活连不上,telnet 也失败——八成是网络模式或服务名写错了。
- 确保两个容器在同一个自定义 network 下(不要用
bridge默认网桥),docker-compose.yml中用networks:显式声明 -
hostname必须填服务名(如mysql),不是localhost或127.0.0.1;Docker DNS 会自动解析服务名为对应容器 IP - 检查容器内能否
ping mysql或nslookup redis,解析失败说明网络或 DNS 配置有问题
复杂点在于:Docker Desktop 的 host.docker.internal 在 Linux 上默认不生效,必须手动添加 --add-host=host.docker.internal:host-gateway。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











