Exemplo: aplicativo "Hello World" em PHP

Essa amostra de código é um aplicativo "Hello World" executado em PHP. Ela mostra como concluir as seguintes tarefas:

  • Conexão a uma instância do Cloud Bigtable
  • Criação de uma nova tabela
  • Gravação de dados na tabela
  • Leitura dos dados
  • Exclusão da tabela

Como executar a amostra

Este exemplo de código usa o pacote Cliente de PHP para o Cloud Bigtable da biblioteca de cliente do Google Cloud para PHP para se comunicar com o Cloud Bigtable.

Para executar este programa de amostra, siga as instruções do exemplo no GitHub.

Como usar a biblioteca de clientes do Cloud com o Cloud Bigtable

O aplicativo de amostra conecta-se ao Cloud Bigtable e demonstra algumas operações básicas.

Como solicitar a biblioteca de cliente

O exemplo usa a classe ApiException do ApiCore, bem como várias classes no cliente PHP para o Cloud Bigtable.

use Google\ApiCore\ApiException;
use Google\Cloud\Bigtable\Admin\V2\BigtableInstanceAdminClient;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\Table;
use Google\Cloud\Bigtable\Admin\V2\Table\View;
use Google\Cloud\Bigtable\BigtableClient;
use Google\Cloud\Bigtable\Mutations;
use Google\Cloud\Bigtable\V2\RowFilter;

Como conectar ao Cloud Bigtable

Estabeleça as variáveis que você usará no aplicativo, usando um ID do projeto do Google Cloud válido, um ID da instância do Cloud Bigtable e um ID de tabela. Em seguida, instancie os novos objetos BigtableInstanceAdminClient, BigtableTableAdminClient e BigtableClient que você usa para se conectar ao Cloud Bigtable.

/** Uncomment and populate these variables in your code */
// $project_id = 'The Google project ID';
// $instance_id = 'The Bigtable instance ID';
// $table_id = 'The Bigtable table ID';

$instanceAdminClient = new BigtableInstanceAdminClient();
$tableAdminClient = new BigtableTableAdminClient();
$dataClient = new BigtableClient([
    'projectId' => $project_id,
]);

Como criar uma tabela

Verifique se a tabela já existe. Se ela ainda não existir, chame o método createtable() para criar um objeto Table. A tabela tem um único grupo de colunas que retém uma versão de cada valor da coluna.

$instanceName = $instanceAdminClient->instanceName($project_id, $instance_id);
$tableName = $tableAdminClient->tableName($project_id, $instance_id, $table_id);

// Check whether table exists in an instance.
// Create table if it does not exists.
$table = new Table();
printf('Creating a Table: %s' . PHP_EOL, $table_id);

try {
    $tableAdminClient->getTable($tableName, ['view' => View::NAME_ONLY]);
    printf('Table %s already exists' . PHP_EOL, $table_id);
} catch (ApiException $e) {
    if ($e->getStatus() === 'NOT_FOUND') {
        printf('Creating the %s table' . PHP_EOL, $table_id);

        $tableAdminClient->createtable(
            $instanceName,
            $table_id,
            $table
        );
        $columnFamily = new ColumnFamily();
        $columnModification = new Modification();
        $columnModification->setId('cf1');
        $columnModification->setCreate($columnFamily);
        $tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
        printf('Created table %s' . PHP_EOL, $table_id);
    } else {
        throw $e;
    }
}

Como gravar linhas em uma tabela

Em seguida, use uma matriz de strings de saudações para criar novas linhas para a tabela. Para cada saudação, crie um novo objeto Mutations e adicione-o a entries usando upsert(). Em seguida, grave as entradas na tabela usando o método mutateRows().

$table = $dataClient->table($instance_id, $table_id);

printf('Writing some greetings to the table.' . PHP_EOL);
$greetings = ['Hello World!', 'Hello Cloud Bigtable!', 'Hello PHP!'];
$entries = [];
$columnFamilyId = 'cf1';
$column = 'greeting';
foreach ($greetings as $i => $value) {
    $row_key = sprintf('greeting%s', $i);
    $rowMutation = new Mutations();
    $rowMutation->upsert($columnFamilyId, $column, $value, time() * 1000 * 1000);
    $entries[$row_key] = $rowMutation;
}
$table->mutateRows($entries);

Como usar um filtro para ler uma linha

Antes de ler os dados que você gravou, crie um filtro para limitar os dados que o Cloud Bigtable retorna. Com esse filtro, o Cloud Bigtable retornará apenas a versão mais recente de cada valor, mesmo que a tabela contenha versões mais antigas que não tenham sido coletadas como lixo.

Crie um objeto row e chame o método readRow(), transmitindo o filtro para receber uma versão de cada coluna dessa linha.

printf('Getting a single greeting by row key.' . PHP_EOL);
$key = 'greeting0';
// Only retrieve the most recent version of the cell.
$row_filter = (new RowFilter)->setCellsPerColumnLimitFilter(1);

$column = 'greeting';
$columnFamilyId = 'cf1';

$row = $table->readRow($key, [
    'rowFilter' => $row_filter
]);
printf('%s' . PHP_EOL, $row[$columnFamilyId][$column][0]['value']);

Como verificar todas as linhas da tabela

Chame o método readRows(), transmitindo o filtro para receber todas as linhas dessa tabela. Como você transmitiu no filtro, o Cloud Bigtable retorna apenas uma versão de cada valor.

$columnFamilyId = 'cf1';
$column = 'greeting';
printf('Scanning for all greetings:' . PHP_EOL);
$partial_rows = $table->readRows([])->readAll();
foreach ($partial_rows as $row) {
    printf('%s' . PHP_EOL, $row[$columnFamilyId][$column][0]['value']);
}

Como excluir tabelas

Exclua a tabela com o método deleteTable() do cliente administrador.

try {
    printf('Attempting to delete table %s.' . PHP_EOL, $table_id);
    $tableAdminClient->deleteTable($tableName);
    printf('Deleted %s table.' . PHP_EOL, $table_id);
} catch (ApiException $e) {
    if ($e->getStatus() === 'NOT_FOUND') {
        printf('Table %s does not exists' . PHP_EOL, $table_id);
    } else {
        throw $e;
    }
}

Funcionamento em conjunto

Veja o exemplo de código completo sem comentários.

<?php

require_once __DIR__ . '/../vendor/autoload.php';

if (count($argv) != 4) {
    return printf("Usage: php %s PROJECT_ID INSTANCE_ID TABLE_ID" . PHP_EOL, __FILE__);
}
list($_, $project_id, $instance_id, $table_id) = $argv;

use Google\ApiCore\ApiException;
use Google\Cloud\Bigtable\Admin\V2\BigtableInstanceAdminClient;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\Table;
use Google\Cloud\Bigtable\Admin\V2\Table\View;
use Google\Cloud\Bigtable\BigtableClient;
use Google\Cloud\Bigtable\Mutations;
use Google\Cloud\Bigtable\V2\RowFilter;

$instanceAdminClient = new BigtableInstanceAdminClient();
$tableAdminClient = new BigtableTableAdminClient();
$dataClient = new BigtableClient([
    'projectId' => $project_id,
]);

$instanceName = $instanceAdminClient->instanceName($project_id, $instance_id);
$tableName = $tableAdminClient->tableName($project_id, $instance_id, $table_id);

$table = new Table();
printf('Creating a Table: %s' . PHP_EOL, $table_id);

try {
    $tableAdminClient->getTable($tableName, ['view' => View::NAME_ONLY]);
    printf('Table %s already exists' . PHP_EOL, $table_id);
} catch (ApiException $e) {
    if ($e->getStatus() === 'NOT_FOUND') {
        printf('Creating the %s table' . PHP_EOL, $table_id);

        $tableAdminClient->createtable(
            $instanceName,
            $table_id,
            $table
        );
        $columnFamily = new ColumnFamily();
        $columnModification = new Modification();
        $columnModification->setId('cf1');
        $columnModification->setCreate($columnFamily);
        $tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
        printf('Created table %s' . PHP_EOL, $table_id);
    } else {
        throw $e;
    }
}

$table = $dataClient->table($instance_id, $table_id);

printf('Writing some greetings to the table.' . PHP_EOL);
$greetings = ['Hello World!', 'Hello Cloud Bigtable!', 'Hello PHP!'];
$entries = [];
$columnFamilyId = 'cf1';
$column = 'greeting';
foreach ($greetings as $i => $value) {
    $row_key = sprintf('greeting%s', $i);
    $rowMutation = new Mutations();
    $rowMutation->upsert($columnFamilyId, $column, $value, time() * 1000 * 1000);
    $entries[$row_key] = $rowMutation;
}
$table->mutateRows($entries);

printf('Getting a single greeting by row key.' . PHP_EOL);
$key = 'greeting0';
$row_filter = (new RowFilter)->setCellsPerColumnLimitFilter(1);

$column = 'greeting';
$columnFamilyId = 'cf1';

$row = $table->readRow($key, [
    'rowFilter' => $row_filter
]);
printf('%s' . PHP_EOL, $row[$columnFamilyId][$column][0]['value']);

$columnFamilyId = 'cf1';
$column = 'greeting';
printf('Scanning for all greetings:' . PHP_EOL);
$partial_rows = $table->readRows([])->readAll();
foreach ($partial_rows as $row) {
    printf('%s' . PHP_EOL, $row[$columnFamilyId][$column][0]['value']);
}

try {
    printf('Attempting to delete table %s.' . PHP_EOL, $table_id);
    $tableAdminClient->deleteTable($tableName);
    printf('Deleted %s table.' . PHP_EOL, $table_id);
} catch (ApiException $e) {
    if ($e->getStatus() === 'NOT_FOUND') {
        printf('Table %s does not exists' . PHP_EOL, $table_id);
    } else {
        throw $e;
    }
}