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.
Este tema enumera algunos ejemplos de operaciones que pueden ejecutarse sobre tablas.
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;
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";
}
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.
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()ysetPartitionKey())RowKey (expuesta mediante
getRowKey()ysetRowKey())Timestamp (expuesta mediante
getTimestamp()ysetTimestamp())Valor Etag (expuesto mediante
getEtag()ysetEtag())
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:
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.
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()ysetPartitionKey())RowKey (expuesta mediante
getRowKey()ysetRowKey())Timestamp (expuesta mediante
getTimestamp()ysetTimestamp())Valor Etag (expuesto mediante
getEtag()ysetEtag())
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.
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";
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'
);
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);
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);
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";
}
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();
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();
}
// ...
![]() |
Advertencia |
|---|---|
¡El manejador de sesiones |
![[Warning]](images/warning.png)