CodeIgniter 4 仅在 APP_ENV=development 或 testing 时自动加载 .env 文件,需确保文件位于根目录、无空格/特殊字符干扰,并用 env() 函数读取;生产环境默认不加载,应直接配置到 Config 文件中。

CodeIgniter 4 怎么读取 .env 文件里的变量
CodeIgniter 4 默认支持 .env,但必须满足两个前提:文件存在且未被重命名,且 DotEnv 类已加载。很多新手把 env 改成 .env 就以为完事了,其实 CI4 启动时会检查 APP_ENV 是否为 development 或 testing,只有在这两种模式下才自动加载 .env;生产环境默认跳过——这是最常被忽略的启动条件。
实操建议:
-
.env必须放在项目根目录(和public/、app/同级),不能放错位置 - 确保
app/Config/App.php中的$environment值与.env里APP_ENV=development一致 - 修改后要清空
writable/cache/和writable/logs/下的缓存文件,否则旧值仍可能生效 - 用
$_ENV['DB_HOST']或getenv('DB_HOST')都能读,但推荐统一用env('DB_HOST')(CI4 提供的辅助函数,会 fallback 到$_SERVER)
为什么 env('DB_PASSWORD') 返回空或 null
不是函数写错了,而是变量没被正确解析:CI4 的 env() 函数对引号、空格、特殊字符极其敏感。比如 DB_PASSWORD="my@pass#123" 看似正常,但 # 被当成注释符直接截断;又或者 DB_HOST = localhost(等号前后有空格)会导致键名识别失败。
常见错误现象:
-
env('DB_PASSWORD')返回null,但print_r($_ENV)里能看到该键——说明环境变量已加载,但env()解析失败 - 密码含
$、{、}、#、(空格)时几乎必出问题
实操建议:
- 所有值强制用单引号包裹:
DB_PASSWORD='my@pass#123'(单引号内不解析变量、不处理注释) - 避免在值中使用
$开头的字符串,如必须用,写成DB_TOKEN='\$secret' - 删掉等号两边所有空格:
APP_DEBUG=true✅,APP_DEBUG = true❌
CodeIgniter 3 能不能用 .env?怎么补上
原生不支持。CI3 没有内置 DotEnv 加载器,强行复制 CI4 的 DotEnv 类过去会报错——它依赖 CI4 的 CodeIgniter\HTTP\URI 等类,而 CI3 是完全不同的架构。
实操建议(轻量可行方案):
- 在
index.php最顶部(require_once FCPATH . 'vendor/autoload.php';之前)插入:if (file_exists(__DIR__ . '/../.env')) { $dotenv = new \Dotenv\Dotenv(__DIR__ . '/..'); $dotenv->load(); } - 需先
composer require vlucas/phpdotenv:^3.0(注意:用 ^3.0,^5.0 不兼容 PHP 7.2+ CI3 环境) - 之后就能用
getenv('DB_HOST'),但env()辅助函数不存在,别硬套 CI4 写法 - 切勿尝试改写 CI3 的
Config类去“自动注入”,容易破坏原有配置加载顺序
部署到服务器后 .env 变量突然失效
不是代码问题,是 Web 服务器权限或运行用户导致的环境隔离。Apache 或 Nginx 通常以 www-data 或 nginx 用户运行,而 .env 文件若由开发者上传(属主是 ubuntu),PHP 进程就无法读取——尤其当文件权限是 600 时。
实操建议:
- 检查
.env权限:chmod 644 .env(不能是 600 或 755) - 确认 Web 用户能访问该文件:
sudo -u www-data cat .env(Apache)或sudo -u nginx cat .env(Nginx) - 某些共享主机禁用
getenv(),可在php.ini中确认variables_order = "EGPCS"包含E - CI4 生产环境默认不加载
.env,应把关键变量(如数据库密码)直接写进app/Config/Database.php,而非依赖文件
环境变量不是魔法,它只是 PHP 进程启动时的一次性输入。一旦进程跑起来,改 .env 就得重启服务或清缓存;而不同环境(CLI / Web / Cron)的加载行为也可能不一致——这点最容易被当成 bug 反复折腾。










