PHPからhandy-spannerに接続する

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);