読者です 読者をやめる 読者になる 読者になる

koni blog

東京のウェブエンジニア koni です!ウェブサービスをガシガシ作っていきます!

PHP で Google Cloud Datastore のデータを読み書きする

PHP で GCP の Cloud Datastore のデータを読み書きしてみました。 あまり情報がないので、とっかかりとしてメモしておきます。

Google App Engine から行いましたが、他の環境からでも動くはずです。

google/google-api-php-clientをありがたく使わせてもらいます。

このライブラリは、Google Cloudではなく、Google APIのライブラリなので、Google Cloudのライブラリ一覧のページには載っていません*1。 が、Google Cloud Client library for PHP はないようなので、こちらを使います。

ライブラリの導入

githubのreadme通りに導入します。

$ composer require google/apiclient:^2.0

ソースコードにautoload.phpをrequireします。

プロジェクトの作成と証明書の取得

Google Developer Consoleから、プロジェクトを作成し(ない場合)、サービスアカウントを作成します。

証明書を取得します。

  1. コンソールを開く
  2. API Manager
  3. 認証情報
  4. 「サービスアカウントキー」を作成
  5. 「App Engine default service account」を選択(新規作成しても可)
  6. jsonファイルがダウンロードできる

ソースコードの設置

hogehoge.json さきほどの証明書

app.yaml

application: practice161003
version: 1
module: default
runtime: php55
api_version: 1

threadsafe: true

handlers:
- url: /
  script: index.php

index.php

<?php

require('vendor/autoload.php');

# 証明書のパス
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . __DIR__ . '/hogehoge.json');

$client = new Google_Client();
$client->useApplicationDefaultCredentials();

$client->addScope(Google_Service_Datastore::DATASTORE);

$datastore = new Google_Service_Datastore($client);

$kind            = new Google_Service_Datastore_KindExpression(['name' => 'User']);
$property        = new Google_Service_Datastore_PropertyReference(['name' => 'name']);
$value           = new Google_Service_Datastore_Value(['stringValue' => 'konishi']);
$property_filter = new Google_Service_Datastore_PropertyFilter([
    'property' => $property, 'op' => 'EQUAL', 'value' => $value]);
$filter          = new Google_Service_Datastore_Filter(['propertyFilter' => $property_filter]);
$query           = new Google_Service_Datastore_Query(['kind' => [$kind], 'filter' => $filter]);
$request         = new Google_Service_Datastore_RunQueryRequest(['query' => $query]);
$result          = $datastore->projects->runQuery('practice161003', $request);
var_dump($response->toSimpleObject());

上記のコードで、kind=Userのエンティティをname=konishiでフィルタしたデータをname列の降順で取得、となります。

ちなみにここに出てくるクラスはすべてGoogle_model クラスを継承しています。 Google_modelを継承するクラスは、setterを使わなくても、コンストラクタに連想配列で渡せるので、$queryは以下のようにもかけます。

$query = new Google_Service_Datastore_Query([
    'kind'   => [
        [
            'name' => 'User',
        ],
    ],
    'filter' => [
        'propertyFilter' => [
            'property' => [
                'name' => 'name',
            ],
            'op'       => 'EQUAL',
            'value'    => [
                'stringValue' => 'konishi'
            ]

        ]
    ],
    'order'  => [
        'property'  => [
            'name' => 'name',
        ],
        'direction' => 'descending',
    ],
    'limit'  => 10,
]);
$request  = new Google_Service_Datastore_RunQueryRequest(['query' => $query]);
$response = $datastore->projects->runQuery('プロジェクト名', $request);

このあたりは好みですかね。 個人的にはどうせラッパー書いてしまうことになると思うので、jsonでだーっと書いてしまう方にしたいと思います。

insert

$mutation = new Google_Service_Datastore_Mutation([
    'insert' => [
        'key'      => [
            'path' => [
                'kind' => 'User',
                'name' => 'keyとなるテキスト',
            ]
        ],
        'properties' => [
            'age' => [
                'excludeFromIndexes' => false,
                'integerValue'       => 27,
            ]
        ]
    ]
]);

$request = new Google_Service_Datastore_CommitRequest([
    'mode'      => 'NON_TRANSACTIONAL',
    'mutations' => [$mutation],
]);

$response = $datastore->projects->commit('プロジェクト名', $request);

jsonは、以下のリファレンスを見て組み立てます。

Method: projects.runQuery  |  Cloud Datastore  |  Google Cloud Platform

便利そうなラッパー作っている人もいますが、2013年で更新されておらず、今は動きません。

https://gae-php-tips.appspot.com/2013/12/24/getting-started-with-the-cloud-datastore-on-php-app-engine-part-ii/

感想

ローカル環境から実行したところ、上記のコードのrunQueryの部分だけで2秒ほどかかっていました。

GAE上だと10msほどになっていました。 Cloud Datastoreのデータはマルチリージョンということですが、GAEのリージョンus-centralになっているので、テストでアップしたデータはus-centralにあるようです。

東京リージョン早く来て欲しいなー。

参考

少し古かったので、現在動かすためには何点か修正が必要でした。

Google Cloud Datastore APIをPHPから使ってみる(データ取得) - Qiita

*1:検索したらありました。https://github.com/GoogleCloudPlatform/google-cloud-php 対応していないサービスが多いので、それ以外のサービスの場合は、API Client Library使ってねと書いてある。