发布于2026-07-07 阅读(0)
扫一扫,手机访问
phpEnv 下用 ThinkPHP 连接 MySQL 频频报错?十有八九不是密码输错了,也不是端口没开,而是两个最不起眼的小细节没对齐——DB_HOST 写了 localhost,或者环境变量根本没生效。

127.0.0.1 而不是 localhostMySQL 在 Windows 下有一个“小脾气”:当你写 localhost 时,它优先尝试通过命名管道或 socket 文件连接,而不是走 TCP/IP。而 phpEnv 默认只启用了 TCP/IP,socket 那条路根本不通。于是,你看到的 SQLSTATE[HY000] [2002] Connection refused,八成就是这么来的。
DB_HOST=localhost → PHP 试着找 MySQL 的 socket 文件,但 phpEnv 没配或者路径不对,直接扑空。DB_HOST=127.0.0.1 → 明确走 TCP/IP,绕过 socket 的问题,稳稳当当。.env 配置优先级和常见覆盖陷阱ThinkPHP 6/8 一旦启用 .env 文件,config/database.php 里的 connections.mysql.hostname 等字段就会被完全忽略。哪怕你只改了 .env 里的一个键,整个连接配置都以它为准。这一点很多人栽过跟头。
.env 文件在项目根目录,且文件名就是 .env——不是 .env.example,也不带 BOM 头。DB_HOST、DB_NAME、DB_USER、DB_PASS 这套(ThinkPHP 8 默认的命名),别写成 DB_USERNAME 或 DB_PASSWORD,不认。@、/、: 这类特殊字符,一定要做 URL 编码。比如 pa@ss/word 要写成 pa%40ss%2Fword。.env 没生效?清空 runtime/cache/ 目录再试试——ThinkPHP 会缓存配置,不清缓存它认旧值。phpEnv 控制面板上显示“MySQL 已启动”,不代表端口真的通了。本地开发最常踩的坑是:MySQL 实际监听的端口是 3307 而不是默认的 3306,尤其当你电脑上装过多个 MySQL 版本时。
server\mysql\mysql-8.0\my.ini,找到 port= 那一行,看看具体是多少(常见是 3306 或 3307)。netstat -ano | findstr :3306(端口换成你配置的值),确认能看到 LISTENING 状态,并且对应的 PID 是 mysqld.exe。127.0.0.1,端口填配置值,用户名密码和 .env 里一致。能连上,说明服务没问题;连不上,别急着改代码,先排查这里。Connection refused 时,先跳过代码,就做上面这一步验证——往往问题就出在这里。Db::connect() 的正确调用方式想在同一个项目里同时连两个库?千万别想着靠改 .env 动态切换,那路子走不通。必须显式声明连接名,然后用 Db::connect('mysql2') 获取 Query 实例。
.env 里加第二组配置,比如 DB2_HOST=127.0.0.1、DB2_NAME=gxsjk,然后在 config/database.php 的 connections 数组里补全对应项。Db::connect('mysql2')->table('user')->select(),别写成 Db::connect(['hostname' => '...'])——后者绕过了容器,事务和事件监听会失效。protected $connection = 'mysql2'; 更安全。config/database.php 中 connections 的键完全一致,大小写敏感。说到底,真正卡住人的往往不是语法有多复杂,而是三个最基础的细节:phpEnv 下 MySQL 实际监听的端口、.env 的命名规范、以及 localhost 和 127.0.0.1 的底层差异。这三个点对齐了,95% 的连接问题就自动消失了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8