Laravel动态加载不同.env文件?Artisan命令执行异常求助
解决方案
要同时兼容Web和CLI环境自动加载对应.env文件,需要区分两种运行环境的判断逻辑,修改bootstrap/app.php中的代码如下:
// 区分Web与CLI环境,分别设置对应的.env文件 if (php_sapi_name() === 'cli') { // CLI环境:根据服务器主机名判断(可根据实际服务器配置调整关键词) $serverHostname = gethostname(); $envFile = str_contains($serverHostname, 'dev') ? '.env' : '.env.uat'; } else { // Web环境:保留原有的域名判断逻辑 $envFile = $_SERVER['HTTP_HOST'] === 'xxx-dev-testing.com' ? '.env' : '.env.uat'; } $app->loadEnvironmentFrom($envFile);
逻辑说明
- Web环境:保持原有通过
HTTP_HOST域名判断的逻辑,匹配开发域名时加载.env,否则加载.env.uat; - CLI环境:通过
php_sapi_name()识别命令行运行场景,利用gethostname()获取服务器主机名,根据主机名中的关键词(如dev)判断环境,自动加载对应配置文件。你可以根据开发/测试服务器的实际主机名调整判断条件(比如用str_contains($serverHostname, 'uat')来匹配测试服务器)。
备选方案(基于系统环境变量)
如果服务器主机名不易区分,也可以通过系统环境变量实现自动识别:
- 在开发服务器的系统配置中添加环境变量(如Linux下编辑
/etc/profile,添加export APP_ENV=dev); - 在测试服务器添加
export APP_ENV=uat; - 修改代码为:
if (php_sapi_name() === 'cli') { $envFile = getenv('APP_ENV') === 'dev' ? '.env' : '.env.uat'; } else { $envFile = $_SERVER['HTTP_HOST'] === 'xxx-dev-testing.com' ? '.env' : '.env.uat'; } $app->loadEnvironmentFrom($envFile);
内容的提问来源于stack exchange,提问作者Ming Tim Chan
相关产品推荐
相关产品推荐

