You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用GA4 Data API v1 runReport获取纯JSON返回方法

问题说明

PHP环境下使用Google Analytics Data API v1对接GA4,期望获取纯JSON格式的报表数据,但调用runReport接口返回的响应对象直接打印仅输出{},仅能通过SDK提供的预定义类方法读取字段数值,需要可行方案获取纯JSON格式返回结果。
现有实现代码如下:

<?php
putenv('GOOGLE_APPLICATION_CREDENTIALS=xxx.json');

require_once '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;
use Google\Cloud\BigQuery\Connection\Rest;

$property_id = 'xxx'; // 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' => '2022-06-30',
      'end_date' => 'today',
    ]),
  ],
  'dimensions' => [
    new Dimension(
      [
        'name' => 'city',
      ]
    ),
  ],
  'metrics' => [
    new Metric(
      [
        'name' => 'activeUsers',
      ]
    )
  ]
]);

print 'Report result: ' . PHP_EOL;

printVisitorsLocationInNumber($response);

function printVisitorsLocationInNumber($resp) {
  foreach ($resp->getRows() as $row) {
    echo
    $row->getDimensionValues()[0]->getValue() . ' ' . $row->getMetricValues()[0]->getValue() . PHP_EOL . '</br>';;
  }
}
原因说明

Google Analytics Data API PHP SDK返回的响应是Protobuf格式的实体对象,不属于普通可直接遍历序列化的PHP stdClass对象,因此直接打印、调用json_encode都会得到空的{}结果。

解决方案

方案1:调用SDK内置序列化方法(推荐)

所有Protobuf消息类都内置了serializeToJsonString()方法,可以直接输出和GA官方API响应结构完全一致的标准JSON字符串,无需手动逐字段映射。
调用示例:

// 接口请求完成后直接获取JSON字符串
$jsonResult = $response->serializeToJsonString();

// 直接输出JSON
header('Content-Type: application/json');
echo $jsonResult;

// 如果需要转成PHP数组处理,二次解码即可
$arrayResult = json_decode($jsonResult, true);

注意:如果调用方法不存在,执行composer update google/analytics-data google/protobuf升级依赖到最新稳定版即可。

方案2:手动组装结构化数据(适配自定义结构需求)

如果只需要提取指定字段、或者需要自定义JSON结构,可以遍历响应对象的内置方法提取字段,组装为PHP数组后再转JSON:

function getCustomReportJson($resp): string
{
    $data = [
        'dimension_headers' => [],
        'metric_headers' => [],
        'rows' => [],
        'total_row_count' => $resp->getRowCount()
    ];
    // 提取维度表头
    foreach ($resp->getDimensionHeaders() as $dimensionHeader) {
        $data['dimension_headers'][] = $dimensionHeader->getName();
    }
    // 提取指标表头
    foreach ($resp->getMetricHeaders() as $metricHeader) {
        $data['metric_headers'][] = $metricHeader->getName();
    }
    // 提取明细行
    foreach ($resp->getRows() as $row) {
        $dimValues = [];
        foreach ($row->getDimensionValues() as $dimValue) {
            $dimValues[] = $dimValue->getValue();
        }
        $metricValues = [];
        foreach ($row->getMetricValues() as $metricValue) {
            $metricValues[] = $metricValue->getValue();
        }
        $data['rows'][] = [
            'dimensions' => array_combine($data['dimension_headers'], $dimValues),
            'metrics' => array_combine($data['metric_headers'], $metricValues)
        ];
    }
    return json_encode($data, JSON_UNESCAPED_UNICODE);
}

// 调用示例
$customJson = getCustomReportJson($response);
echo $customJson;
代码修正提示

原代码中引入的Google\Cloud\BigQuery\Connection\Rest属于BigQuery服务相关类,和GA4报表接口调用无关,可以删除避免不必要的类加载开销。

内容的提问来源于stack exchange,提问作者Voon Tao Tan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:36:21