すでに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;
}
}