0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LaravelとGA4 連携

Last updated at Posted at 2025-01-16

すでにGA4の設定をGCPの設定済みと仮定して、Laravelでの実装のみのアプトプットになります。
もし、それまでの設定が必要な場合は下記の記事を参考にしてくだしい。
https://www.fourier.jp/blog/ga4-with-php

ライブラリーをインストール

composer require google/analytics-data

これも追加

composer require google/apiclient

JSONファイルをstoragaディレクトリー配置する必要がある
(gitignore設定は必須)

しかしエラー

Class "Google\Analytics\Data\V1beta\BetaAnalyticsDataClient" not found

ライブラリーは正しく存在されていることを確認

composer show | grep google/analytics-data
google/analytics-data              0.22.0  Google Analytics Data Client for PHP

解決

パスが変わってたみたい(下記が新しい名前空間です)

use Google\Analytics\Data\V1beta\Client\BetaAnalyticsDataClient;

bcmathが必要とエラーが出たのでDockerfileに追加

RUN apt-get update && apt-get install -y \
  git \
  unzip \
  libpq-dev \
  libzip-dev \
  && docker-php-ext-install pdo pdo_mysql zip bcmath

これで使えるようになった

 public function handle()
    {
        $propertyId = config('google.analytics.propertyId');
        $credentialsPath = config('google.analytics.credentials');

        $client = new BetaAnalyticsDataClient([
            'credentials' => $credentialsPath,
            'transport'   => 'rest',
        ]);

        $request = new RunReportRequest([
            'property'   => 'properties/' . $propertyId,
            'date_ranges' => [
                new DateRange([
                    'start_date' => '30daysAgo',
                    'end_date'   => 'today',
                ]),
            ],
            'dimensions' => [
                new Dimension(['name' => 'pagePath']),
                new Dimension(['name' => 'pageTitle']),
            ],
            'metrics' => [
                new Metric(['name' => 'screenPageViews']),
            ],
            'limit' => 100,
        ]);

        $response = $client->runReport($request);

        foreach ($response->getRows() as $row) {
            $dimensionValues = $row->getDimensionValues();
            $metricValues    = $row->getMetricValues();

            $pagePath  = $dimensionValues[0]->getValue();
            $pageTitle = $dimensionValues[1]->getValue();
            $pageViews = $metricValues[0]->getValue();

            $this->info("Path: $pagePath | Title: $pageTitle | PV: $pageViews");
        }

    }

ここからcronで時間で自動的に実行されるようにする

メモ
job_batches テーブルが作成されたがこれは何?

laravel11からはroutes/console.logに記述が必要になったみたい
https://readouble.com/laravel/11.x/ja/scheduling.html

一旦下記のように記述してみたがうまくいかない

use Illuminate\Support\Facades\Schedule;
Schedule::command('analitics-command')->everyMinute() //毎分実行;

しかし、php artisan schedule:listをして確認すると実行はされているっぽい
なぜか,ログには実行内容が記述されない

php artisan schedule:list

  0 * * * *  php artisan inspire ........................................................................................................................................ Next Due: 14分後
  * * * * *  php artisan analitics-command .............................................................................................................................. Next Due: 56秒後

下記のコマンドを実行すると処理は実行されるが根本的な問題は解決していない

 php artisan schedule:run

解決

cron をインストールが必要
一旦コンテナに直でインストール

apt-get install cron

これがないとcron ファイルを操作できない

apt-get install -y nano

cron 設定ファイルを修正する必要があるため、ファイルを開く

crontab -e

Laravelのスケジュールコマンドを毎分実行する設定を追加します。(ここはパスによって変更が必要(

* * * * * cd /var/www/html && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1

cronサービスを起動

service cron start

実際に動いているか確認

service cron status
cron is running.

時間通りに処理もうまくいっている

リアルタイム(30分)のごとの値を取得する

<?php

namespace App\Console\Commands\GoogleAnalytics;

use Illuminate\Console\Command;

use Google\Analytics\Data\V1beta\Client\BetaAnalyticsDataClient;

// リアルタイム レポート関連クラス
use Google\Analytics\Data\V1beta\RunRealtimeReportRequest;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;

class RealTimeReportCommand extends Command
{
   /**
    * The name and signature of the console command.
    */
   protected $signature = 'app:real-time-report-command';

   /**
    * The console command description.
    */
   protected $description = 'GA4のリアルタイムレポート (runRealtimeReport) でデータを取得する';

   public function handle()
   {
       // 1) 環境変数や config などから GA4 プロパティID と 認証JSONパスを取得
       $propertyId = config('google.analytics.propertyId');   // 例: 123456789
       $credentialsPath = config('google.analytics.credentials'); // 例: storage_path('service-account.json')

       // 2) BetaAnalyticsDataClient のインスタンスを生成
       //    'credentials' にサービスアカウントJSONのパスを指定
       $client = new BetaAnalyticsDataClient([
           'credentials' => $credentialsPath,
       ]);

       try {
           // 3) リアルタイム レポート用リクエストを作成
           //    ※ "property" は "properties/123456789" の形で設定する
           //    ※ 取得したい dimension / metric に注意
           $request = new RunRealtimeReportRequest([
               'property' => "properties/{$propertyId}",
               'dimensions' => [
                   // new Dimension(['name' => 'eventName']),
                   new Dimension(['name' => 'unifiedScreenName']), // 記事名
               ],
               'metrics' => [
                   // new Metric(['name' => 'activeUsers']),
                   new Metric(['name' => 'screenPageViews']), // PV数
               ],
               'limit' => 10,
           ]);

           // 4) 実際に runRealtimeReport を呼び出し
           $response = $client->runRealtimeReport($request);

           // 5) レスポンスを表示
           $this->info("---- GA4 Realtime Report ----");
           foreach ($response->getRows() as $row) {
               // dd($row);
               $dimensions = $row->getDimensionValues();
               $metrics = $row->getMetricValues();

               $unifiedScreenName = $dimensions[0]->getValue() ?? '(no event)';
               $screenPageViews = $metrics[0]->getValue() ?? 0;
               // $activeUsers = $metrics[1]->getValue() ?? 0;
               // $eventName = $metrics[2]->getValue() ?? '(no event)';


               $this->info("unifiedScreenName: {$unifiedScreenName}, screenPageViews: {$screenPageViews}");

           }
       } catch (\Exception $e) {
           $this->error("Error: " . $e->getMessage());
       }

       return 0;
   }
}

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?