<p>ThinkPHP 6.x 默认优先读取根目录下的 .env 文件,若其中 DB_ 配置项存在(如 DB_HOST、DBNAME 等),则 config/database.php 中同名配置会被覆盖;.env 必须无 BOM、命名正确、键名规范(DB 格式)、密码含特殊字符需 URL 编码,且 localhost 应改为 127.0.0.1 避免 Unix socket 连接失败。</p>

ThinkPHP 6.x 默认走 .env 配置,改 config/database.php 却连不上,八成是 .env 里同名键还在生效——它优先级永远更高。
确认 .env 文件位置和命名是否正确
ThinkPHP 只认项目根目录下名为 .env 的文件(不是 .env.example,也不能带 BOM 或后缀)。常见问题:
-
.env放在app/或config/下——无效,必须在项目最外层目录 - 用记事本保存过,悄悄加了 UTF-8 BOM——导致
env()解析失败,DB_HOST等全为空 - 文件实际叫
.env.local或.env.production——ThinkPHP 6.x 不支持多环境文件自动加载,只读.env
数据库连接字段必须用 DB_* 命名(ThinkPHP 8+ 默认)
ThinkPHP 6.3+ 和 8.x 默认使用 DB_HOST、DB_NAME、DB_USER、DB_PASS 这套键名。如果沿用老教程里的 database.hostname 写法,env('database.hostname') 会取不到值,最终 fallback 到默认的 127.0.0.1,但密码或端口可能错配。
正确写法示例(.env 文件内容):
立即学习“PHP免费学习笔记(深入)”;
DATABASE_TYPE=mysql DB_HOST=127.0.0.1 DB_NAME=tp6_test DB_USER=root DB_PASS=root DB_PORT=3306 DB_CHARSET=utf8mb4
注意:DB_PASS 含 @、/、: 时必须 URL 编码,比如密码是 pa@ss/word,得写成 DB_PASS=pa%40ss%2Fword,否则 PDO 初始化直接报 SQLSTATE[HY000] [1045]。
本地开发必须用 127.0.0.1,不能填 localhost
填 localhost 会让 PDO 尝试走 Unix socket 而非 TCP,而 phpEnv、XAMPP、Docker 等环境下 MySQL 往往只监听 TCP(尤其当端口不是 3306 时)。现象是:Navicat 能连,ThinkPHP 报 Connection refused。
验证方式:
- 查 phpEnv 的
my.ini,确认port=值(常见为3306或3307) - 命令行运行
netstat -ano | findstr :3306(把 3306 换成你配置的端口),看是否有LISTENING状态且 PID 对应mysqld.exe - 用
mysql -h 127.0.0.1 -P 3306 -u root -p手动测试连通性
远程 MySQL 连接失败?先跳过代码,只做三件事
看到 SQLSTATE[HY000] [2003] Can't connect to MySQL server,别急着改 PHP 代码:
- 确认 MySQL 服务器
bind-address设为0.0.0.0(不是127.0.0.1),改完执行sudo systemctl restart mysql - 在 PHP 所在服务器上执行
nc -zv 203.124.55.88 3306(IP 换成你的 MySQL 公网地址),返回succeeded才算网络通 - 云服务商安全组必须放行该端口,且「源 IP」填 PHP 服务器的**出口公网 IP**(不是内网 IP),腾讯云填安全组规则,AWS 填 Security Group Inbound Rule
远程场景下填 localhost、127.0.0.1 或域名,全部错误——必须用 MySQL 服务器的公网 IPv4 地址,且 .env 中写 DB_HOST=203.124.55.88。



















