laravel-websockets 在本地运行获取的是 .env 而不是 .env.local 的配置
laravel 新项目默认会有 .env.example 和 .env.local 文件。当环境变量 APP_ENV=local 时加载 .env.local 的配置, 此外通过 php artisan serve 启动的 web 服务 和 laravel-sail 默认的 web服务 会读取 .env 文件中的 APP_ENV 并写入到环境变量中(laravel-sail 默认的 web服务 就是 php artisan serve)。 而且一般 .env.local 是 sail 环境下的各种配置, 一般不用动。 然后复制一个 .env.example 为 .env,然后在 .env 基础上进行修改, 作为线上环境的配置文件。
今天下班早,打开了我很久没开机的台式机 (一般都用笔记本),拉了一个自己的项目下来跑一跑。一切都很舒服, 然后舒服没一会儿。 发现我的 python 客户端一点反应没有, 一开 debug 发现收不到广播。 然后各种找 bug , 包括检查 docker 端口映射, 重新 build 容器,等等。 找了一晚上 bug , 最后发现修改 .env 中的 websocket配置就好了 。我以为config/broadcasting.php 中的 env() 获取的应该是 .env.local 结果却是 .env 。
又查了下资料, 貌似是因为 laravel-websockets 是通过终端的命令启动的,终端命令如果要指定 APP_ENV 需要添加 –env 选项。 如果添加 –env=local, env() 拿到的就是 .env.local 里面的配置信息, 否则为 .env
php artisan websockets:serve --env=local
protected function checkForSpecificEnvironmentFile($app)
{
if ($app->runningInConsole() &&
($input = new ArgvInput)->hasParameterOption('--env') &&
$this->setEnvironmentFilePath($app, $app->environmentFile().'.'.$input->getParameterOption('--env'))) {
return;
}
$environment = Env::get('APP_ENV');
if (! $environment) {
return;
}
$this->setEnvironmentFilePath(
$app, $app->environmentFile().'.'.$environment
);
}
APP_ENV=local 时加载 .env.local 的配置
多谢科普,我一直都不知道有这个设定。。不过你可以展开说说这个 .env.local 的加载过程么?因为我之前看
dotEnv
的时候没看到这块。回复太难写了,开新回复了。
你提供的函数位置你的 .env 文件并未加载
这里的行为是确认你要加载的 env 文件的位置
最终要读取的文件是根据你环境变量设定的。并不会跟随你的 .env 文件确认。
可以换位思考一下,我要先读取 env 文件,然后发现可能存在环境文件,我再去读取 env.环境 文件,你觉得这合理么?
检查下你环境变量是否有设置这个 APP_ENV