在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS
Posted
技术标签:
【中文标题】在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS【英文标题】:Loading GOOGLE_APPLICATION_CREDENTIALS in Laravel 5 【发布时间】:2018-03-05 22:33:45 【问题描述】:我正在使用 Laravel 5.2,我按照官方文档中的建议使用 php artisan config:cache
以提高速度。
您可能知道,此命令使 .env 文件变量无法直接访问(您可以使用 php artisan tinker
对其进行测试),因此所有对 env()
和 getenv()
函数的调用都必须替换为 @代码中的987654326@,除了config文件夹中的文件。执行此命令后,env('APP_ENV')
等调用返回 NULL。
在我的项目中,我使用 google-auth-library-php 连接到 Google Cloud。不幸的是,在 CredentialsLoader.php 文件中有一个对函数 getenv(self::ENV_VAR)
的调用,该函数试图获取 Google 凭据文件的路径。当我运行命令php artisan config:cache
时,无法从.env文件中读取路径,无法完成连接。
我可以看到 3 种方式继续:
-
忘记运行
php artisan config:cache
。
在这里询问是否有人知道如何将 Google 凭据文件的路径指定为包的任何函数的参数。
(请原谅我,上帝)更正 CredentialsLoader.php 文件(getenv()
为 config()
),运行命令并在存储库中跟踪此文件,然后此更改将在每个团队成员拉取时传播。
提前谢谢你!
【问题讨论】:
从 env 加载的是CredentialsLoader::fromEnv
。在 CredentialsLoader 上使用另一种方法是有意义的,或者使用配置中的设置手动创建凭据。
嗨!现在已经 3 年了... :) 你的解决方案是什么?
好吧,实际上我是用一个特定的配置完成的...... Nignx + php 和 fastcgi。我会回答,因为如果将来有人会再次访问这个问题,也许会有所帮助
【参考方案1】:
这是一个非常古老的问题,但即使在较新版本的 Laravel 中,它也可能对遇到同样问题的人有用。
基本上我没有适用于所有可能环境的解决方案,但它给出了这个想法。
我的环境运行php7.4-fpm
和nginx
。
如果您使用相同的环境,您的 php 文件将有一个 location
指令。
Nginx 可以用fastcgi_param
设置FastCGI 参数,你可能已经用过SCRIPT_FILENAME
等。
然后可以添加
location ~ \.php$
fastcgi_split_path_info ^(.+\.php)(/.+)$;
[...]
fastcgi_param GOOGLE_APPLICATION_CREDENTIALS "/absolute/path/to/keyfile.json";
然后只需重新加载 Nginx(例如,对于 Ubuntu 20.04,sudo systemctl reload nginx
)。
对于 Apache,同样的想法可能适用于 SetEnv
https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv
【讨论】:
【参考方案2】:如果还是遇到这个错误,可以在第一个参数中使用keyFile
index指定文件:
$storage = new StorageClient([
'keyFile' => json_decode(file_get_contents($path), true),
]);
或者您可以使用keyFilePath
index 直接指定 .json 文件进行配置
$storage = new StorageClient([
'keyFilePath' => '/path/to/json/CompanyDataStorage-foobarbaz.json',
]);
【讨论】:
以上是关于在 Laravel 5 中加载 GOOGLE_APPLICATION_CREDENTIALS的主要内容,如果未能解决你的问题,请参考以下文章