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使ってねと書いてある。