TigerZF
🌐Español

64.37. Zend_Service_WindowsAzure_Storage_Table

El servicio Table ofrece almacenamiento estructurado en forma de tablas.

Table Storage es ofrecido por Windows Azure como una API REST que se envuelve con la clase Zend_Service_WindowsAzure_Storage_Table para proporcionar una interfaz nativa PHP a la cuenta de almacenamiento.

Este tema enumera algunos ejemplos de uso de la clase Zend_Service_WindowsAzure_Storage_Table. Otras características están disponibles en el paquete de descarga, así como una documentación detallada de la API de dichas características.

Tenga en cuenta que el almacenamiento de tablas de desarrollo (en el SDK de Windows Azure) no soporta todas las características proporcionadas por la API. Por lo tanto, los ejemplos listados en esta página deben usarse en el almacenamiento de tablas de producción de Windows Azure.

64.37.1. Operaciones sobre tablas

Este tema enumera algunos ejemplos de operaciones que pueden ejecutarse sobre tablas.

64.37.1.1. Creación de una tabla

Usando el siguiente código, se puede crear una tabla en el almacenamiento de tablas de producción de Windows Azure.

Ejemplo 64.173. Creación de una tabla

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$result = $storageClient->createTable('testtable');

echo 'New table name is: ' . $result->Name;

64.37.1.2. Listado de todas las tablas

Usando el siguiente código, se puede consultar una lista de todas las tablas del almacenamiento de tablas de producción de Windows Azure.

Ejemplo 64.174. Listado de todas las tablas

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$result = $storageClient->listTables();
foreach ($result as $table) {
    echo 'Table name is: ' . $table->Name . "\r\n";
}

64.37.2. Operaciones sobre entidades

Las tablas almacenan datos como colecciones de entidades. Las entidades son similares a filas. Una entidad tiene una clave primaria y un conjunto de propiedades. Una propiedad es un par nombre-valor tipado, similar a una columna.

El servicio Table no impone ningún esquema a las tablas, por lo que dos entidades en la misma tabla pueden tener distintos conjuntos de propiedades. Los desarrolladores pueden optar por imponer un esquema en el lado del cliente. Una tabla puede contener cualquier número de entidades.

Zend_Service_WindowsAzure_Storage_Table ofrece 2 formas de trabajar con entidades:

  • Esquema forzado

  • Sin esquema forzado

Todos los ejemplos harán uso de la siguiente clase de esquema forzado.

Ejemplo 64.175. Esquema forzado usado en los ejemplos

class SampleEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
{
    /**
    * @azure Name
    */
    public $Name;

    /**
    * @azure Age Edm.Int64
    */
    public $Age;

    /**
    * @azure Visible Edm.Boolean
    */
    public $Visible = false;
}

Tenga en cuenta que si no se pasa ninguna clase de esquema a los métodos de table storage, Zend_Service_WindowsAzure_Storage_Table trabaja automáticamente con Zend_Service_WindowsAzure_Storage_DynamicTableEntity.

64.37.2.1. Entidades con esquema forzado

Para imponer un esquema en el lado del cliente usando la clase Zend_Service_WindowsAzure_Storage_Table, puede crear una clase que herede de Zend_Service_WindowsAzure_Storage_TableEntity. Esta clase proporciona alguna funcionalidad básica para que la clase Zend_Service_WindowsAzure_Storage_Table trabaje con un esquema del lado del cliente.

Las propiedades base proporcionadas por Zend_Service_WindowsAzure_Storage_TableEntity son:

  • PartitionKey (expuesta mediante getPartitionKey() y setPartitionKey())

  • RowKey (expuesta mediante getRowKey() y setRowKey())

  • Timestamp (expuesta mediante getTimestamp() y setTimestamp())

  • Valor Etag (expuesto mediante getEtag() y setEtag())

Aquí tiene una clase de ejemplo que hereda de Zend_Service_WindowsAzure_Storage_TableEntity:

Ejemplo 64.176. Ejemplo de clase de esquema forzado

class SampleEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
{
    /**
     * @azure Name
     */
    public $Name;

    /**
     * @azure Age Edm.Int64
     */
    public $Age;

    /**
     * @azure Visible Edm.Boolean
     */
    public $Visible = false;
}

La clase Zend_Service_WindowsAzure_Storage_Table asignará cualquier clase heredada de Zend_Service_WindowsAzure_Storage_TableEntity a entidades de table storage de Windows Azure con el tipo de dato y nombre de propiedad correctos. Todo lo que hay que hacer para almacenar una propiedad en Windows Azure es añadir un comentario docblock a una propiedad pública o a un getter/setter público, con el siguiente formato:

Ejemplo 64.177. Propiedad forzada

/**
 * @azure <property name in Windows Azure> <optional property type>
 */
public $<property name in PHP>;

Veamos cómo definir una propiedad "Age" como un entero en el table storage de Windows Azure:

Ejemplo 64.178. Ejemplo de propiedad forzada

/**
 * @azure Age Edm.Int64
 */
public $Age;

Tenga en cuenta que una propiedad no tiene por qué llamarse igual en el table storage de Windows Azure. El nombre de la propiedad en el table storage de Windows Azure puede definirse, así como el tipo.

Se admiten los siguientes tipos de datos:

  • Edm.Binary - Un array de bytes de hasta 64 KB de tamaño.

  • Edm.Boolean - Un valor booleano.

  • Edm.DateTime - Un valor de 64 bits expresado en Tiempo Universal Coordinado (UTC). El rango de DateTime admitido comienza a las 12:00 de la medianoche del 1 de enero de 1601 d. C. (E.C.), Tiempo Universal Coordinado (UTC). El rango termina el 31 de diciembre de 9999.

  • Edm.Double - Un valor de punto flotante de 64 bits.

  • Edm.Guid - Un identificador único global de 128 bits.

  • Edm.Int32 - Un entero de 32 bits.

  • Edm.Int64 - Un entero de 64 bits.

  • Edm.String - Un valor codificado en UTF-16. Los valores de cadena pueden llegar a tener hasta 64 KB de tamaño.

64.37.2.2. Entidades sin esquema forzado (también conocidas como DynamicEntity)

Para usar la clase Zend_Service_WindowsAzure_Storage_Table sin definir un esquema, puede hacer uso de la clase Zend_Service_WindowsAzure_Storage_DynamicTableEntity. Esta clase hereda de Zend_Service_WindowsAzure_Storage_TableEntity igual que una clase de esquema forzado, pero contiene lógica adicional para hacerla dinámica y no estar ligada a un esquema.

Las propiedades base proporcionadas por Zend_Service_WindowsAzure_Storage_DynamicTableEntity son:

  • PartitionKey (expuesta mediante getPartitionKey() y setPartitionKey())

  • RowKey (expuesta mediante getRowKey() y setRowKey())

  • Timestamp (expuesta mediante getTimestamp() y setTimestamp())

  • Valor Etag (expuesto mediante getEtag() y setEtag())

Se pueden añadir otras propiedades sobre la marcha. Su tipo en el table storage de Windows Azure se determinará dinámicamente:

Ejemplo 64.179. Añadiendo propiedades dinámicamente a Zend_Service_WindowsAzure_Storage_DynamicTableEntity

$target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(
    'partition1', '000001'
);
$target->Name = 'Name'; // Will add property "Name" of type "Edm.String"
$target->Age  = 25;     // Will add property "Age" of type "Edm.Int32"

Opcionalmente, se puede forzar un tipo de propiedad:

Ejemplo 64.180. Forzando tipos de propiedad en Zend_Service_WindowsAzure_Storage_DynamicTableEntity

$target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(
    'partition1', '000001'
);
$target->Name = 'Name'; // Will add property "Name" of type "Edm.String"
$target->Age  = 25;     // Will add property "Age" of type "Edm.Int32"

// Change type of property "Age" to "Edm.Int32":
$target->setAzurePropertyType('Age', 'Edm.Int64');

La clase Zend_Service_WindowsAzure_Storage_Table trabaja automáticamente con Zend_Service_WindowsAzure_Storage_TableEntity si no se pasa ninguna clase específica a los métodos de Table Storage.

64.37.2.3. Ejemplos de la API de entidades

64.37.2.3.1. Inserción de una entidad

Usando el siguiente código, se puede insertar una entidad en una tabla llamada "testtable". Tenga en cuenta que la tabla ya ha sido creada previamente.

Ejemplo 64.181. Inserción de una entidad

$entity = new SampleEntity ('partition1', 'row1');
$entity->FullName = "Maarten";
$entity->Age = 25;
$entity->Visible = true;

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$result = $storageClient->insertEntity('testtable', $entity);

// Check the timestamp and etag of the newly inserted entity
echo 'Timestamp: ' . $result->getTimestamp() . "\n";
echo 'Etag: ' . $result->getEtag() . "\n";

64.37.2.3.2. Recuperación de una entidad por clave de partición y clave de fila

Usando el siguiente código, se puede recuperar una entidad por clave de partición y clave de fila. Tenga en cuenta que la tabla y la entidad ya han sido creadas previamente.

Ejemplo 64.182. Recuperación de una entidad por clave de partición y clave de fila

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entity= $storageClient->retrieveEntityById(
    'testtable', 'partition1', 'row1', 'SampleEntity'
);

64.37.2.3.3. Actualización de una entidad

Usando el siguiente código, se puede actualizar una entidad. Tenga en cuenta que la tabla y la entidad ya han sido creadas previamente.

Ejemplo 64.183. Actualización de una entidad

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entity = $storageClient->retrieveEntityById(
    'testtable', 'partition1', 'row1', 'SampleEntity'
);

$entity->Name = 'New name';
$result = $storageClient->updateEntity('testtable', $entity);

Si desea asegurarse de que la entidad no haya sido actualizada previamente, puede hacer que se compruebe el Etag de la entidad. Si la entidad ya ha tenido una actualización, la actualización fallará para asegurarse de que no sobrescriba ningún dato más reciente.

Ejemplo 64.184. Actualización de una entidad (con comprobación de Etag)

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entity = $storageClient->retrieveEntityById(
    'testtable', 'partition1', 'row1', 'SampleEntity'
);

$entity->Name = 'New name';

// last parameter instructs the Etag check:
$result = $storageClient->updateEntity('testtable', $entity, true);

64.37.2.3.4. Eliminación de una entidad

Usando el siguiente código, se puede eliminar una entidad. Tenga en cuenta que la tabla y la entidad ya han sido creadas previamente.

Ejemplo 64.185. Eliminación de una entidad

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entity = $storageClient->retrieveEntityById(
    'testtable', 'partition1', 'row1', 'SampleEntity'
);
$result = $storageClient->deleteEntity('testtable', $entity);

64.37.2.4. Realización de consultas

Las consultas en el table storage de Zend_Service_WindowsAzure_Storage_Table pueden realizarse de dos maneras:

  • Creando manualmente una condición de filtro (lo que implica aprender un nuevo lenguaje de consulta)

  • Usando la interfaz fluida proporcionada por Zend_Service_WindowsAzure_Storage_Table

Usando el siguiente código, se puede consultar una tabla usando una condición de filtro. Tenga en cuenta que la tabla y las entidades ya han sido creadas previamente.

Ejemplo 64.186. Realización de consultas usando una condición de filtro

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entities = $storageClient->storageClient->retrieveEntities(
    'testtable',
    'Name eq \'Maarten\' and PartitionKey eq \'partition1\'',
    'SampleEntity'
);

foreach ($entities as $entity) {
    echo 'Name: ' . $entity->Name . "\n";
}

Usando el siguiente código, se puede consultar una tabla usando una interfaz fluida. Tenga en cuenta que la tabla y las entidades ya han sido creadas previamente.

Ejemplo 64.187. Realización de consultas usando una interfaz fluida

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);
$entities = $storageClient->storageClient->retrieveEntities(
    'testtable',
    $storageClient->select()
                  ->from($tableName)
                  ->where('Name eq ?', 'Maarten')
                  ->andWhere('PartitionKey eq ?', 'partition1'),
    'SampleEntity'
);

foreach ($entities as $entity) {
    echo 'Name: ' . $entity->Name . "\n";
}

64.37.2.5. Operaciones por lotes

Este tema muestra cómo usar las características de transacción de grupo de entidades de tabla proporcionadas por el table storage de Windows Azure. El table storage de Windows Azure admite transacciones por lotes sobre entidades que están en la misma tabla y pertenecen al mismo grupo de partición. Una transacción puede incluir como máximo 100 entidades.

El siguiente ejemplo usa una operación por lotes (transacción) para insertar un conjunto de entidades en la tabla "testtable". Tenga en cuenta que la tabla ya ha sido creada previamente.

Ejemplo 64.188. Ejecución de una operación por lotes

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);

// Start batch
$batch = $storageClient->startBatch();

// Insert entities in batch
$entities = generateEntities();
foreach ($entities as $entity) {
    $storageClient->insertEntity($tableName, $entity);
}

// Commit
$batch->commit();

64.37.3. Manejador de sesiones de table storage

Al ejecutar una aplicación PHP en la plataforma Windows Azure en modo balanceado (ejecutando 2 instancias de Web Role o más), es importante que los datos de sesión de PHP puedan compartirse entre varias instancias de Web Role. El SDK de Windows Azure para PHP proporciona la clase Zend_Service_WindowsAzure_SessionHandler, que usa Windows Azure Table Storage como manejador de sesiones para aplicaciones PHP.

Para usar el manejador de sesiones Zend_Service_WindowsAzure_SessionHandler, debe registrarse como el manejador de sesiones por defecto de su aplicación PHP:

Ejemplo 64.189. Registro del manejador de sesiones de table storage

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);

$sessionHandler = new Zend_Service_WindowsAzure_SessionHandler(
    $storageClient , 'sessionstable'
);
$sessionHandler->register();

El nombre de clase anterior registra el manejador de sesiones Zend_Service_WindowsAzure_SessionHandler y almacenará las sesiones en una tabla llamada "sessionstable".

Después de registrar el manejador de sesiones Zend_Service_WindowsAzure_SessionHandler, las sesiones pueden iniciarse y usarse de la misma forma que una sesión normal de PHP:

Ejemplo 64.190. Uso del manejador de sesiones de table storage

$storageClient = new Zend_Service_WindowsAzure_Storage_Table(
    'table.core.windows.net', 'myaccount', 'myauthkey'
);

$sessionHandler = new Zend_Service_WindowsAzure_SessionHandler(
    $storageClient , 'sessionstable'
);
$sessionHandler->register();

session_start();

if (!isset($_SESSION['firstVisit'])) {
    $_SESSION['firstVisit'] = time();
}

// ...

[Warning] Advertencia

¡El manejador de sesiones Zend_Service_WindowsAzure_SessionHandler debe registrarse antes de que se realice una llamada a session_start()!