推荐在Hyperf 3.1的.env中将DB_HOST设为127.0.0.1而非localhost,因其强制走TCP连接,避免Unix socket路径不一致、权限匹配失败、IPv6解析异常及Swoole不支持socket等问题,提升跨环境部署稳定性。

推荐在 Hyperf 3.1 的 .env 中将 DB_HOST=127.0.0.1,而不是 localhost。
MySQL 默认用 Unix socket 连 localhost
在 Linux/macOS 系统上,当 PHP(或 Hyperf)使用 MySQL 客户端连接 localhost 时,默认走 Unix domain socket,不经过 TCP/IP 协议栈。这虽然快,但要求:
- MySQL 配置中
socket路径正确且可访问(如/var/run/mysqld/mysqld.sock); - PHP 的
mysqli.default_socket或 PDO 的unix_socket参数需匹配; - Hyperf 的数据库配置未显式指定
unix_socket,容易因路径不一致而报错:Can't connect to local MySQL server through socket。
127.0.0.1 强制走 TCP,行为更确定
使用 127.0.0.1 会绕过 socket 机制,强制走本地回环 TCP 连接:
- 不依赖
/etc/my.cnf或php.ini中的 socket 路径配置; - 权限检查走
'user'@'127.0.0.1'或'user'@'%',避免因只授权了'user'@'localhost'导致拒绝访问; - Docker 环境、CI/CD 构建、部分云托管平台(如某些轻量服务器)对 socket 支持不稳定,TCP 更通用。
IPv6 不是干扰项,但 localhost 可能意外走 ::1
现代系统常把 localhost 解析为 IPv6 的 ::1(尤其在启用 IPv6 且 hosts 文件含 ::1 localhost 时):
- 若 MySQL 未监听
::1(默认通常不监听),连接就会失败,错误提示可能含Connection refused; -
127.0.0.1始终是纯 IPv4,无歧义,适配所有 MySQL 部署场景。
Hyperf 本身不干预 host 解析,靠底层驱动决定
Hyperf 使用 PDO 或 Swoole MySQL 扩展,其连接逻辑继承自 PHP 或 Swoole 底层:
- PDO_MySQL 对
host=localhost的处理遵循 MySQL C client 行为(优先 socket); - Swoole MySQL 客户端不支持 Unix socket,
localhost会被当作域名解析——若 hosts 配置异常或 DNS 不可用,可能失败; - 统一用
127.0.0.1可规避这些差异,降低部署出错概率。











