Google Cloud Spanner、すごいサービスなんですが公式でローカルエミュレーターがないのでローカル環境でのテストが大変。
そこで、@kazegusuriさんがhandy-spannerというSQLite3をバックエンドにしたCloud Spannerのローカルエミュレーター的なものを作っていてものすごく便利。
Go以外でhandy-spannerに接続
handy-spanner自体はGoで書かれているがCloud Spanner APIサーバーとしてふるまうgRPC Serverを立てる仕組みなので、 gRPCが通じればどのような言語でも接続できる。
ということで、PHPから接続してみた。
<?php $baseClient = new Google\Cloud\Spanner\V1\SpannerClient([ 'serviceAddress' => 'localhost:9999', 'transportConfig' => [ 'grpc' => [ 'stubOpts' => [ 'credentials' => ChannelCredentials::createInsecure(), ] ] ], ]); $spannerClientOptions = [ 'gapicSpannerClient' => $baseClient, ]; $spanner = new SpannerClient($spannerClientOptions); $db = $client->connect($instanceId, $databaseId); var_dump($db->execute('SELECT "Hello, world"')->rows()->current());
実行結果
array(1) { [0] => string(12) "Hello, world" }
どうやって接続しているか
Cloud SpannerのClientは裏でgRPC接続をしているので、次の2つをやればOK
- gRPC接続先を
localhost:9999
(handy-spannerの default address)に差し替える - 認証をInsecureに差し替える
ただ、PHPのClient Config系は型がなくてarrayで渡す形式なのでIDEで補完が出なくてつらかった。。 がんばってPHPDocを呼んでconfig名を見つけるしかない!
その結果、PHPのコードとしては次のようになる。
<?php $baseClient = new Google\Cloud\Spanner\V1\SpannerClient([ 'serviceAddress' => 'localhost:9999', 'transportConfig' => [ 'grpc' => [ 'stubOpts' => [ 'credentials' => ChannelCredentials::createInsecure(), ] ] ], ]);
これを new SpannerClient
の config に gapicSpannerClient
として渡してあげればよい。
<?php $spannerClientOptions = [ 'gapicSpannerClient' => $baseClient, ]; $spanner = new SpannerClient($spannerClientOptions);