在Laravel 5中加载GOOGLE_APPLICATION_CREDENTIALS

时间:2017-09-25 03:01:55

标签: php laravel google-cloud-storage gcp google-cloud-sdk

我正在使用Laravel 5.2并按照官方文档中的建议php artisan config:cache进行速度提升。

如您所知,此命令使.env文件变量直接无法访问(您可以使用php artisan tinker进行测试),因此对env()getenv()的所有调用都是如此函数必须由代码中的config()替换,但config文件夹中的文件除外。执行此命令后,env('APP_ENV')之类的调用将返回NULL。

在我的项目中,我使用google-auth-library-php连接到Google Cloud。不幸的是,在CredentialsLoader.php文件中,调用函数getenv(self::ENV_VAR),试图获取Google凭证文件的路径。当我运行命令php artisan config:cache时,无法从.env文件中读取路径,并且无法完成连接。

我可以看到3种方法继续:

  1. 忘记运行php artisan config:cache
  2. 在这里询问是否有人知道如何指定Google凭据文件的路径作为包的任何功能的参数。
  3. (原谅我,上帝)更正CredentialsLoader.php文件(getenv()config()),运行命令并在存储库中跟踪此文件,然后此更改将传播给每个团队成员他们拉。
  4. 提前谢谢!

2 个答案:

答案 0 :(得分:0)

这是一个非常老的问题,但即使对于较新版本的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

答案 1 :(得分:0)

对于那些仍然遇到此错误的人,您可以在第一个参数中使用 keyFile 索引指定文件:

$storage = new StorageClient([
   'keyFile' => json_decode(file_get_contents($path), true),
]);

或者您可以使用 keyFilePath 索引直接指定 .json 文件进行配置

$storage = new StorageClient([
   'keyFilePath' => '/path/to/json/CompanyDataStorage-foobarbaz.json',
]);