应使用DB_HOST=127.0.0.1而非localhost,因localhost在Linux/macOS下默认走Unix socket易出错,而127.0.0.1强制走TCP连接更稳定可靠。

Hyperf 3.1 连接 MySQL 报 Connection refused,核心原因不是代码写错,而是连接目标不可达。重点排查方向是:MySQL 服务是否运行、端口是否监听、网络路径是否通、认证配置是否匹配。下面分几类常见情况给出直接可操作的解决步骤。
确认 MySQL 服务已启动且监听正确端口
执行命令检查:
- sudo systemctl status mysql 或 sudo service mysqld status —— 看服务是否 active
- sudo ss -tlnp | grep :3306(或你配置的端口)—— 确认 MySQL 正在监听 3306(或自定义端口),且监听地址包含 127.0.0.1:3306 或 *:3306
- 若只监听 :::3306(IPv6),而你的 DB_HOST=127.0.0.1 是 IPv4,则可能失败;需在 /etc/mysql/mysql.conf.d/mysqld.cnf 中确保 bind-address = 127.0.0.1 或 0.0.0.0,并重启 MySQL
检查 .env 中 DB_HOST 和端口是否合理
务必使用 DB_HOST=127.0.0.1,不要用 localhost:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- localhost 在 Linux/macOS 下默认走 Unix socket,易因路径不一致或 Swoole 不支持而报错;127.0.0.1 强制走 TCP,行为稳定
- 确认 DB_PORT=3306(或实际端口),避免配置成 0 或空值
- Docker 环境下,若 MySQL 在另一个容器,DB_HOST 不能填 127.0.0.1(那是容器自己),应填 MySQL 容器名(如 mysql),并确保在同一 network
验证用户权限与访问来源匹配
MySQL 的用户授权是按 'user'@'host' 组合判断的:
- 如果 DB_HOST=127.0.0.1,MySQL 必须有 'your_user'@'127.0.0.1' 或 'your_user'@'%' 的账号,不能只有 'your_user'@'localhost'
- 登录 MySQL 执行:SELECT User, Host FROM mysql.user; 查看实际授权记录
- 如需新增,执行:CREATE USER 'your_user'@'127.0.0.1' IDENTIFIED BY 'password'; GRANT ALL ON your_db.* TO 'your_user'@'127.0.0.1'; FLUSH PRIVILEGES;
排除防火墙与 SELinux 干扰
即使本地连接,某些系统策略也可能拦截:
- Ubuntu/Debian:sudo ufw status,若启用,放行端口:sudo ufw allow 3306
- CentOS/RHEL:sudo firewall-cmd --list-ports,添加:sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload
- SELinux 启用时(sestatus 查看),临时关闭测试:sudo setenforce 0;若恢复正常,需调整策略而非永久关闭










