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
);
}
推荐文章: