Indexing Todayを作るにあたってGoogleのIndexing APIのbatch実行の勉強したので、サンプルプログラムを残します。
はじめに
前回に引き続き、PHPでサンプル実装をします。
今回はバッチ実行という方法です。
前回は、URL1件ごとにAPIを実行するプログラムでした。前回のプログラム(高速化の工夫をしていない)状態で、1秒あたり3件~4件(1分あたり200件程度)の送信が可能です。
件数が少ないうちは1件ずつ送る方法で問題はありませんが、URLの総数が多いときには時間がかかってしまいます。
バッチ実行とは
1件1件丁寧に送ると時間がかかるのですが、これを高速化する方法がバッチ実行です。バッチ実行をすると最大100個のURLを1回の送信で実行できます。
ただし、バッチ実行をしても1日あたりのURL送信数の上限は変わりません。DefaultPublishRequestsPerDayPerProject
の値で定義されていますが、batch実行でも送ったURLの数で数えます。つまりbatchでもシングルでも同じく200までということになります。
インストール
インストール先は前回と同じく以下のディレクトリに置きます。
C:\tmp\indexing-api-sample
前回の記事も参考にしてください。 blog.indexing.today
ソースコード
PHPのサンプルコードです。 エラー処理など手抜きしてあります。コメントが入っているので参考にご自身で作り変えてください。
<?php require_once './vendor/autoload.php'; //https://developers.google.com/search/apis/indexing-api/v3/quota-pricing //TODO:DefaultRequestsPerMinutePerProject=600 を超えないように実行速度を調整すること //TODO:DefaultPublishRequestsPerDayPerProject=200 を超えたときのハンドリングをすること // 1回の実行URL const BATCH_SIZE = 100; //認証用のファイル(jsonフォルダの下に置いて書き換える) $credentialFile = './json/your-credeintial.json'; //indexing APIを投げるURL(自分のURLに書き換える) $urlList = ['https://example.com/','https://example.com/1','https://example.com/2']; // HTTPクライアント // debug=trueにすると通信ログが確認できる。 $options = ['http_errors' => false, 'debug' => false, 'verify'=>false, ]; $guzzle = new GuzzleHttp\Client($options); //Indexing APIの準備 $client = new Google_Client(); $client->addScope(Google_Service_Indexing::INDEXING); $client->setHttpClient($guzzle); $client->setAuthConfig($credentialFile); $client->authorize(); $client->setUseBatch(true); $service = new Google_Service_Indexing($client); //URLの配列を1回のAPI送信量に分割(最大100) $chunks = array_chunk($urlList, BATCH_SIZE); foreach($chunks as $batchNo=>$batchUrls){ //batchのインスタンスはURLのセットごとに作る //第二引数はboundaryの値。変える必要性はないのでfalseでよい // $batch = new Google_Http_Batch($client,false,'https://indexing.googleapis.com'); と同じ $batch = new Google_Http_Batch($client, false, $service->rootUrl); foreach($batchUrls as $n=>$url){ $param = new Google_Service_Indexing_UrlNotification(); $param->setType('URL_UPDATED');//登録・更新 $param->setUrl($url); //setUseBatch(true)にしてあると、ここでリクエストが送られずrequestインスタンスが返ってくるのでbatchにaddする $request = $service->urlNotifications->publish($param); //第二引数のキーはresultsのキーになる(渡さなくてもOK) $batch->add($request, "api-{$batchNo}-{$n}"); } //addしたリクエストを実行。batchをexecuteすると、結果が複数返ってくる $results = $batch->execute(); foreach($results as $key=>$result){ // 正常なら Google\Service\Indexing\UrlNotification // エラーなら Google\Service\Exception // クラスに違いがあるので注意 echo "$key : " . get_class($result) .PHP_EOL; //batch実行でエラーが起きると、resultの中身がExceptionクラスになるので、エラーを見極めるにはinstanceofで実施 if($result instanceof Exception){ echo "error code | {$result->getCode()}" . PHP_EOL; echo "resson | {$result->getErrors()[0]['reason']}" . PHP_EOL; echo "message | {$result->getErrors()[0]['message']}" .PHP_EOL; if($result->getCode()==429){ //実行回数上限を超えたときは、ここでとらえる } break; }else{ //resultsの中のresultから、notificationを取り出す $notification = $result->getUrlNotificationMetadata()->getLatestUpdate(); //大したものはとれないけど、取るならこの形 var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getUrl()); var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getNotifyTime()); var_dump($result->getUrlNotificationMetadata()->getLatestUpdate()->getType()); echo "$key | {$notification->getUrl()} | {$notification->getNotifyTime()}" . PHP_EOL; } } }
ここからダウンロードもできます
https://github.com/kanaxx/indexing-api-sample/blob/main/batch_execution.php
修正するところ2つ
サンプルのプログラムは一部、環境ごとに変わる部分があるので編集します。
batch_execute.php
ファイルを開き、2か所編集します。
//認証用のファイル(jsonフォルダの下に置いて書き換える) $credentialFile = './json/your-credeintial.json'; //indexing APIを投げるURL(自分のURLに書き換える) $urlList = ['https://example.com/','https://example.com/1','https://example.com/2'];
- 12行目:GoogleのAPIの認証ファイル(JSON)のファイル名と一致するように書き換えます
- 15行目:APIに投げ込むURLを自分用に書き換えます。配列形式で複数並べられます。
修正点はここだけです。
実行
準備ができたので実行します。以下のコマンドを実行すると動きます。
$ cd C:\tmp\indexing-api-sample $ php batch_execution.php
たらたらとログが出てきて終了します。
実際に自分のAPIが実行できたのかは、GoogleのAPI Consoleの画面で確認できます。「現在の使用量」が増えていればOKです。(少し遅れてきます)
https://console.cloud.google.com/apis/api/indexing.googleapis.com/quotas
最後にまだわかってないこと
Indexing APIの制限事項の1つである DefaultRequestsPerMinutePerProject
がどうやって集計されるのか理解できていないです。
これは1分間に送れるリクエストの数の上限で、デフォルトで600件です。1バッチリクエストを1回と数えると思うので、1分間で600リクエストx100URLで6万まで行けるのだろうか。
ただ、過去30日の実績を見てもグラフに何も表示されていないので、もしかしたらIndexing APIではリクエスト数はカウントされないのかもしれない。
参考資料
インデックス登録の一括リクエストを送信する
https://developers.google.com/search/apis/indexing-api/v3/using-api#batching
[覚書] Indexing API バッチAPIでやってみる [PHP]
このブログが役に立ちました。
https://blog.tkouen.mydns.jp/wordpress/699