laravel多环境配置核心是通过.env文件分离敏感信息与环境逻辑,结合config/目录中的env()调用实现按需覆盖,部署时运行php artisan config:cache提升性能。

Laravel项目多环境配置的核心在于分离敏感信息与环境逻辑,避免硬编码,同时保证不同环境加载各自配置。关键不是“写多个配置文件”,而是建立一套可预测、可复用、可部署的机制。
用 .env 文件区分基础环境变量
每个环境对应一个独立的 `.env` 文件(如 `.env.local`、`.env.staging`、`.env.production`),Laravel 启动时会自动加载匹配 `APP_ENV` 值的文件(需确保 `APP_ENV` 已正确设置)。 你不需要手动切换文件名,只需在部署时设置系统级环境变量或通过命令指定: - 在服务器上运行:`APP_ENV=production php artisan config:cache` - 或在 Nginx/Apache 配置中设置 `SetEnv APP_ENV production`.env 文件只存变量值,不包含逻辑。例如:
APP_ENV=production APP_DEBUG=false DB_HOST=prod-db.example.com CACHE_DRIVER=redis REDIS_HOST=redis-prod
注意:`.env` 文件不能提交到 Git,应加入 `.gitignore`;所有 `env()` 调用都应带默认值(如 `env('APP_DEBUG', false)`),防止缺失时报错。
在 config/ 目录中按需覆盖配置项
Laravel 的 `config/*.php` 文件是 PHP 数组,天然支持条件判断。你可以直接在配置文件里做轻量环境判断: ```php // config/cache.php 'default' => env('CACHE_DRIVER', 'file'), 'stores' => [ 'redis' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => (int) env('REDIS_PORT', 6379), ], ], ```这种写法简洁、清晰,适合大多数场景。不需要为每个环境建一整套 config 文件——除非模块化程度高或配置差异极大。
模块化项目用 Laravel-Modules 的环境配置结构
如果你使用 `nwidart/laravel-modules`,推荐在每个模块内设环境适配层: - `Modules/Blog/Config/config.php`:主配置,含通用键和 `env()` 调用 - `Modules/Blog/Config/config.local.php`:开发专用覆盖(如 mock API 地址、调试开关) - `Modules/Blog/Config/config.production.php`:生产专用覆盖(如 CDN 域名、限流策略)然后在模块的 `ServiceProvider` 中按 `APP_ENV` 动态合并:
```php $this->mergeConfigFrom( __DIR__.'/Config/config.php', 'blog' ); if (file_exists(__DIR__.'/Config/config.'.app()->environment().'.php')) { $this->mergeConfigFrom( __DIR__.'/Config/config.'.app()->environment().'.php', 'blog' ); } ```部署前缓存配置提升性能
开发时每次请求都读 `.env`,但生产环境必须运行: ```bash php artisan config:cache ```该命令把所有 `config/*.php` 和 `.env` 解析结果编译成单个优化后的 PHP 数组文件,跳过重复解析。未执行此步可能导致环境变量不生效或性能下降。
缓存后若修改 `.env`,需重新运行 `config:cache`;也可用 `config:clear` 清除缓存临时调试。











