配置Google Analytics Data API (GA4)时无法读取凭证文件求助
问题描述
按照Google官方快速开始指南配置GA4 Data API PHP版本时,已将credentials.json与quickstart.php放在同一目录,使用putenv设置环境变量:
putenv('GOOGLE_APPLICATION_CREDENTIALS="'.__DIR__.'/credentials.json"');
运行时始终报错:
Fatal error: Uncaught DomainException: Unable to read the credential file specified by GOOGLE_APPLICATION_CREDENTIALS: file "/google/credentials.json" does not exist in /google/vendor/google/auth/src/CredentialsLoader.php:81 Stack trace: #0 /google/vendor/google/auth/src/ApplicationDefaultCredentials.php(160): Google\Auth\CredentialsLoader::fromEnv() #1 /google/vendor/google/gax/src/CredentialsWrapper.php(267): Google\Auth\ApplicationDefaultCredentials::getCredentials() #2 /google/vendor/google/gax/src/CredentialsWrapper.php(136): Google\ApiCore\CredentialsWrapper::buildApplicationDefaultCredentials() #3 /google/vendor/google/gax/src/GapicClientTrait in /google/vendor/google/gax/src/CredentialsWrapper.php on line 275
反复确认路径无误但问题依旧,使用环境为PHP + GA4 Data API。
附完整测试代码:
<?php header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); date_default_timezone_set('Europe/London'); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); putenv('GOOGLE_APPLICATION_CREDENTIALS="'.__DIR__.'/credentials.json"'); require 'vendor/autoload.php'; use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient; use Google\Analytics\Data\V1beta\DateRange; use Google\Analytics\Data\V1beta\Dimension; use Google\Analytics\Data\V1beta\Metric; /** * TODO(developer): Replace this variable with your Google Analytics 4 * property ID before running the sample. */ $property_id = 'YOUR-GA4-PROPERTY-ID'; // Using a default constructor instructs the client to use the credentials // specified in GOOGLE_APPLICATION_CREDENTIALS environment variable. $client = new BetaAnalyticsDataClient(); // Make an API call. $response = $client->runReport([ 'property' => 'properties/' . $property_id, 'dateRanges' => [ new DateRange([ 'start_date' => '2020-03-31', 'end_date' => 'today', ]), ], 'dimensions' => [new Dimension( [ 'name' => 'city', ] ), ], 'metrics' => [new Metric( [ 'name' => 'activeUsers', ] ) ] ]); // Print results of an API call. print 'Report result: ' . PHP_EOL; foreach ($response->getRows() as $row) { print $row->getDimensionValues()[0]->getValue() . ' ' . $row->getMetricValues()[0]->getValue() . PHP_EOL; } ?>
解决思路与方案
1. 移除环境变量值的引号
问题根源在于putenv设置时给路径添加了多余的双引号,Google Auth库解析时会把引号当作路径的一部分,导致找不到文件。修正代码:
// 去掉路径两端的双引号 putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__.'/credentials.json');
2. 直接在客户端构造时传入凭据路径(替代环境变量方案)
如果环境变量设置仍有问题,可以跳过环境变量,直接在初始化BetaAnalyticsDataClient时指定凭据文件路径:
$client = new BetaAnalyticsDataClient([ 'credentials' => __DIR__.'/credentials.json' ]);
3. 额外排查点
- 文件权限:确保
credentials.json文件对PHP运行进程有可读权限(如设置为644)。 - 绝对路径验证:可以先输出
__DIR__.'/credentials.json'的值,确认路径是否正确,比如:
复制输出的路径到系统中验证文件是否存在。echo __DIR__.'/credentials.json'; exit; - 环境变量生效时机:确保
putenv调用在require 'vendor/autoload.php'之前执行,避免库提前读取环境变量。
内容的提问来源于stack exchange,提问作者Tommy Cunningham

