等号两侧绝对不能有空格,否则整行被跳过且静默失效;含@、!、%等特殊字符的值必须用双引号包裹,如db_pwd="abc@123%",否则会被截断;多等号值(如base64密钥)也必须加双引号。

等号两侧绝对不能有空格
ThinkPHP 用 vlucas/phpdotenv 解析 .env,它对等号位置极其敏感:只要 DB_HOST = 127.0.0.1 这种写法出现一个空格,整行就会被跳过,且不报错、不警告——你改了 IP 却连不上数据库,大概率卡在这儿。
实操建议:
-
DB_HOST=127.0.0.1✅(等号紧贴键和值) -
DB_HOST = 127.0.0.1❌(左侧或右侧有空格都失效) - 用编辑器开启「显示不可见字符」,确认没有全角空格、零宽字符或制表符
- Linux/macOS 下可用
cat -A .env查看是否混入^M或M-bM-^@等非法字节
值含特殊字符时必须用引号包裹
当密码或密钥含 @、!、%、$ 等字符时,不加引号会导致截断。例如 DB_PWD=abc@123% 可能被解析成 abc,因为 @ 和 % 在 dotenv v5.4+ 中会被当作变量分隔符或转义标记处理。
实操建议:
- 统一用双引号:
DB_PWD="abc@123%"✅(兼容 Laravel 生态与 CI 工具链) - 单引号也可用但不推荐:
DB_PWD='abc@123%'——新版 dotenv 对单引号内内容不做展开,虽能避免截断,但部分部署环境(如某些容器镜像)会误判为字面量 - 验证方式:在控制器里输出
dump(getenv('DB_PWD')),看结果是否和.env里写的**完全一致**
多等号值(如 base64、JWT 密钥)怎么写
像 APP_KEY=base64:xxx=yyy=zzz 这种含多个等号的值,如果没正确处理,phpdotenv 默认会按第一个 = 切割,导致后面全丢。
实操建议:
- 必须加双引号:
APP_KEY="base64:xxx=yyy=zzz"✅ - 不要用
parse_ini_file()解析.env——它不是 INI 格式,无节名,且无法处理多等号 - 也不要用
include()——这是执行 PHP 代码,存在严重安全隐患 - ThinkPHP 内置的加载逻辑已适配该场景,前提是引号规范、编码正确、路径无误
为什么改了等号格式还是不生效
即使等号写对了,.env 仍可能静默失效,常见干扰项有:
-
APP_ENV被系统级设置覆盖:Nginx 或 CLI 启动时执行了export APP_ENV=prod,ThinkPHP 就不再读.env - 文件不在根目录:必须和
app/、public/同级,放错位置(比如进了public/)就加载不到 - UTF-8 带 BOM:Windows 记事本默认保存带签名,
file -i .env显示charset=bom就得重存为 UTF-8 无 BOM - 没清缓存:改完必须运行
php think clear:config,否则runtime/config.php一直用旧值
最易忽略的是:你以为只是等号问题,其实根本没加载到文件——先确认 getenv('APP_ENV') 和 env('APP_ENV') 输出是否一致,不一致就是被系统变量劫持了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











