ThinkPHP报Database connection refused的Redis或MySQL连接排查

夜浩吖_2758

夜浩吖_2758

2026-04-21

577人浏览

原创

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

thinkphp报database connection refused的redis或mysql连接排查

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-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
'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免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10984

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6401

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2155

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4048

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4754

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3731

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5357

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4182

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12122

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习