Ejemplo: aplicación PHP “Hello World”

Esta muestra de código es una aplicación “hello world” que se ejecuta en PHP. En este ejemplo, se muestra cómo completar las siguientes tareas:

  • Conectarse a una instancia de Cloud Bigtable.
  • Crear una tabla nueva
  • Escribir datos en la tabla
  • Volver a leer datos
  • Borrar la tabla

Ejecuta la muestra

Esta muestra de código usa el paquete cliente PHP para Cloud Bigtable de la biblioteca cliente de Google Cloud para PHP con el fin de comunicarse con Cloud Bigtable.

Para ejecutar el programa de muestra, sigue las instrucciones que se indican en GitHub.

Usa la biblioteca cliente de Cloud con Cloud Bigtable

La aplicación de muestra se conecta con Cloud Bigtable y demuestra algunas operaciones simples.

Requisitos de la biblioteca cliente

La muestra usa la clase ApiException de ApiCore, así como una serie de clases en el cliente PHP para 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;

Conectarse con Cloud Bigtable

Establece las variables que usarás en tu aplicación con un ID del proyecto de Google Cloud válido, un ID de instancia de Cloud Bigtable y un ID de tabla. Luego, crea una instancia de los objetos BigtableInstanceAdminClient, BigtableTableAdminClient y BigtableClient nuevos que usas para conectarte a 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,
]);

Crea una tabla

Comprueba si tu tabla ya existe. Si no es así, llama al método createtable() para crear un objeto Table. La tabla tiene una sola familia de columnas, que contiene una versión de cada valor.

$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;
    }
}

Escribe filas en una tabla

A continuación, usa un arreglo de strings de saludos a fin de crear algunas filas nuevas para la tabla. Para cada saludo, crea un objeto Mutations nuevo y agrégalo a entries mediante upsert(). Luego, escribe las entradas en la tabla con el método mutateRows() de la tabla.

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

Usa un filtro para leer una fila

Antes de leer los datos que escribiste, crea un filtro para limitar los datos que muestre Cloud Bigtable. El filtro le indica a Cloud Bigtable que muestre solo la versión más reciente de cada valor, incluso si la tabla contiene versiones anteriores que no pasaron por el proceso de recolección de elementos no utilizados.

Crea un objeto de fila, llama al método readRow() y, luego, aplica el filtro para obtener una versión de cada valor de la fila.

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

Analiza todas las filas de una tabla

Llama al método readRows() y aplica el filtro para pasar todas las filas de la tabla. Dado que aplicaste el filtro, Cloud Bigtable solo mostrará una versión 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']);
}

Borra una tabla

Borra la tabla con el método deleteTable() del 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;
    }
}

Revisión general

El código de muestra completo sin comentarios.

<?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;
    }
}