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から、プロジェクトを作成し(ない場合)、サービスアカウントを作成します。
証明書を取得します。
- コンソールを開く
- API Manager
- 認証情報
- 「サービスアカウントキー」を作成
- 「App Engine default service account」を選択(新規作成しても可)
- 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年で更新されておらず、今は動きません。
感想
ローカル環境から実行したところ、上記のコードの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使ってねと書いてある。