Windows Azure Storage pro PHPkáře

Jedna ze služeb poskytovaných Windows Azure je tzv. Storage. V tomto článku se zaměříme pouze na podporu Windows Azure Table Storage v PHP.

Autor: Štěpán Bechynský, Microsoft

Jedna ze služeb poskytovaných Windows Azure je tzv. Storage, které poskytuje tři typy úložišť – blob, queue a table.

  • Blob – uložiště pro nestrukturovaná data, typicky soubory
  • Queue – fronta pro zprávy
  • Table – uložiště pro strukturovaná data, typicky objekty

Podrobné informace najdete např. zde. V tomto článku se zaměříme pouze na podporu Windows Azure Table Storage v PHP.

Nemám přístup k Windows Azure, co mám dělat?

Nevadí. V podstatě celé prostředí Windows Azure můžete simulovat na lokálním počítači pomocí Windows Azure Software Development Kit. Nás bude hlavně zajímat Development Storage, která simuluje Windows Azure Storage na vašem počítači.

Klepněte pro větší obrázek

Protože Windows Azure SDK vyžaduje IIS a SQL Server 2008 (stačí Express), doporučuji nejdříve doinstalovat vše potřebné pomocí Web Platform Installer.

Přístup k Windows Azure Table Storage

Pro přístup k Windows Azure Table Storage se používá návrhový vzor REST. Stačí tedy správně sestavit URL, požadavek podepsat (http://msdn.microsoft.com/en-us/library/dd179428.aspx) a máte přístup k informacím, které jsou v tabulce uloženy. Ze serveru dostanete odpověď ve formátu ATOM. Několik příkladů:

Seznam tabulek

Požadavek:

https://msdays2010.table.core.windows.net/Tables()

Odpověď:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<feed xml:base="https://msdays2010.table.core.windows.net/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">

<title type="text">Tables</title>

<id>https://msdays2010.table.core.windows.net/Tables</id>

<updated>2010-11-21T07:01:03Z</updated>

<link rel="self" title="Klepněte pro větší obrázek" href="Tables" />

<entry>

<id>https://msdays2010.table.core.windows.net/Tables('Customers')</id>

<title type="text"></title>

<updated>2010-11-21T07:01:03Z</updated>

<author>

<name />

</author>

<link rel="edit" title="Klepněte pro větší obrázek" href="Tables('Customers')" />

<category term="msdays2010.Tables" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />

<content type="application/xml">

<m:properties>

<d:TableName>Customers</d:TableName>

</m:properties>

</content>

</entry>

<entry>

<id>https://msdays2010.table.core.windows.net/Tables('testtable')</id>

<title type="text"></title>

<updated>2010-11-21T07:01:03Z</updated>

<author>

<name />

</author>

<link rel="edit" title="Klepněte pro větší obrázek" href="Tables('testtable')" />

<category term="msdays2010.Tables" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />

<content type="application/xml">

<m:properties>

<d:TableName>testtable</d:TableName>

</m:properties>

</content>

</entry>

</feed>

Obsah tabulky Customers

Požadavek:

https://msdays2010.table.core.windows.net/Customers()

Odpověď:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<feed xml:base="https://msdays2010.table.core.windows.net/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">

<title type="text">Customers</title>

<id>https://msdays2010.table.core.windows.net/Customers</id>

<updated>2010-11-21T07:03:24Z</updated>

<link rel="self" title="Klepněte pro větší obrázek" href="Customers" />

<entry m:etag="W/&quot;datetime'2010-11-20T10%3A02%3A17.479744Z'&quot;">

<id>https://msdays2010.table.core.windows.net/Customers(PartitionKey='partition1',RowKey='2')</id>

<title type="text"></title>

<updated>2010-11-21T07:03:24Z</updated>

<author>

<name />

</author>

<link rel="edit" title="Klepněte pro větší obrázek" href="Customers(PartitionKey='partition1',RowKey='2')" />

<category term="msdays2010.Customers" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />

<content type="application/xml">

<m:properties>

<d:PartitionKey>partition1</d:PartitionKey>

<d:RowKey>2</d:RowKey>

<d:Timestamp m:type="Edm.DateTime">2010-11-20T10:02:17.479744Z</d:Timestamp>

<d:Discount m:type="Edm.Double">0.2</d:Discount>

<d:FirstName>Štěpán</d:FirstName>

<d:LastName>C#</d:LastName>

</m:properties>

</content>

</entry>

<entry m:etag="W/&quot;datetime'2010-11-20T10%3A01%3A45.6890838Z'&quot;">

<id>https://msdays2010.table.core.windows.net/Customers(PartitionKey='partition1',RowKey='4')</id>

<title type="text"></title>

<updated>2010-11-21T07:03:24Z</updated>

<author>

<name />

</author>

<link rel="edit" title="Klepněte pro větší obrázek" href="Customers(PartitionKey='partition1',RowKey='4')" />

<category term="msdays2010.Customers" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />

<content type="application/xml">

<m:properties>

<d:PartitionKey>partition1</d:PartitionKey>

<d:RowKey>4</d:RowKey>

<d:Timestamp m:type="Edm.DateTime">2010-11-20T10:01:45.6890838Z</d:Timestamp>

<d:FirstName>Štěpán</d:FirstName>

<d:LastName>PHP</d:LastName>

<d:Discount m:type="Edm.Double">0.1</d:Discount>

</m:properties>

</content>

</entry>

</feed>

Abyste nemuseli psát vlastní kód pro sestavování dotazů, jejich podepisování a následné zpracování odpovědí, můžete použít knihovnu Windows Azure SDK for PHP (http://phpazure.codeplex.com/).

Windows Azure SDK for PHP

Po stažení knihovny Windows Azure SDK for PHP stačí rozbalit zip archiv na libovolné místo a upravit proměnnou include_path v php.ini. Pro připojení na Windows Azure Table Storage musíte znát doménu, kde služba běží, jméno účtu (Account Name) a bezpečnostní klíč (Account Key).

Klepněte pro větší obrázek

V mém případě je doména table.core.windows.net, Account Name msdays2010 a Account Key r7h0…bQ==. Klče máte dva, kdyby se jeden prozradil, tak použijete druhý, záložní a zkompromitovaný klíč vygenerujete znovu. Pokud budete chtít použít lokální Developer Storage použijete následující nastavení (viz. http://msdn.microsoft.com/en-us/library/dd179339.aspx):

Doména: 127.0.0.1:10002

Account Name: devstoreaccount1

Account Key: Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==

Pro připojené k Windows Azure Table Storage slouží objekt Microsoft_WindowsAzure_Storage_Table. Následující kód vypíše seznam tabulek:

<?php
include_once 'Microsoft/WindowsAzure/Storage/Table.php';
$storageClient = new Microsoft_WindowsAzure_Storage_Table('127.0.0.1:10002',
'devstoreaccount1',
'Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==');
$result = $storageClient->listTables();
echo "Seznam tabulek:\r\n";
foreach ($result as $table)
{
echo "\t" . $table->Name . "\r\n";
}
?>

Vytvoření tabulky: $storageClient->createTable('Customers');

Pokud chcete do tabulky uložit nový záznam, je třeba nejdříve vytvořit třídu, která bude záznam popisovat. Protože se nejedná o relační databázi, je možné do jedné tabulky ukládat objekty, které odvozeny z různých tříd. Zjednodušeně by se dalo říct, co veřejná vlastnost třídy to pole v tabulce. Každý záznam má tři povinné vlastnosti – PartitionKey, RowKey a Timestamp. Tyto vlastnosti najdete v základní třídě Microsoft_WindowsAzure_Storage_TableEntity z které musí vaše třída vycházet. Protože je PHP slabě typový jazyk, je třeba pomocí komentářů říct, jaký datový typ budou jednotlivé vlastnosti ukládat. Popis datových typů najdete v dokumentaci (http://phpazure.codeplex.com/wikipage?title=Defining%20entities%20for%20Table%20Storage&referringTitle=Getting%20Started).

<?php
class Customer extends Microsoft_WindowsAzure_Storage_TableEntity
{
/**
* @azure FirstName Edm.String
*/
public $FirstName;
/**
* @azure LastName Edm.String
*/
public $LastName;
/**
* @azure Discount Edm.Double
*/
public $Discount = 0.1;
}
?>

Uložení záznamu pak vypadá následovně:

$customer = new Customer('partition1', 'key1');
$customer->FirstName = 'Štěpán';
$customer->LastName = 'PHP';
$result = $storageClient->insertEntity('Customers', $customer);

Vypsání všech záznamů z tabulky Customers, které jsou v partition1 a měli by být datového typu Customer:

<?php
include_once 'Microsoft/WindowsAzure/Storage/Table.php';
include_once 'Customer.php';
$storageClient = new Microsoft_WindowsAzure_Storage_Tabl
('table.core.windows.net',

'msdays2010',
'r7h0Exq+77wD+bE9MRaMAP3QvOneW/mHrcSFODADl8wVe4FqIvGvswVxW0KCzKcyGqZej43qQFm1O3qPwktXbQ==');
$entities = $storageClient->retrieveEntities(
'Customers',
'PartitionKey eq \'partition1\'',
'Customer');
foreach ($entities as $entity)
{
echo 'Name: ' . $entity->FirstName . ' ' . $entity->LastName . "\n";
}
?>

V případě, že chcete záznam změnit, je třeba ho získat na základě EntityKey a použít metodu updateEntity.

<?php
include_once 'Microsoft/WindowsAzure/Storage/Table.php';
include_once 'Customer.php';
$storageClient = new Microsoft_WindowsAzure_Storage_Tabl
('table.core.windows.net',

'msdays2010',
'r7h0Exq+77wD+bE9MRaMAP3QvOneW/mHrcSFODADl8wVe4FqIvGvswVxW0KCzKcyGqZej43qQFm1O3qPwktXbQ==');
$entity = $storageClient->retrieveEntityById('Customers', 'partition1', '4', 'Customer');
$entity->LastName = 'PHP 5';
$result = $storageClient->updateEntity('Customers', $entity, true);
?>

Záznam pak logicky odstraníte metodou deleteEntity.

Závěr

Využití Windows Azure Table Storage je velmi jednoduché, zejména když máte dostupné knihovny, které komunikaci zapouzdřují.

Štěpán Bechynský, Microsoft
Televize pro vývojáře
Vše pro vývojáře

Články ze série Microsoft TechNet nevytváří redakce Živě.cz, ale partneři programu Microsoft TechNet. Jsou publikovány v rámci mediálního partnerství Živě.cz a společnosti Microsoft.

Témata článku: Software, Microsoft, PHP, Author, Account, Term, Echo, Self, Rest

Určitě si přečtěte

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

Operační systém běžným počítačům nedal Bill Gates, ale Gary Kildall

** Gary Kildall pochopil, že levné výpočetní čipy mohou posloužit jako univerzální počítače pro všechny ** Připravil pro ně proto první operační systém ** Později mu systém vyfoukl Microsoft a nazval ho MS DOS

23.  4.  2017 | Pavel Tronner | 52

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

Umělá inteligence je sice v plenkách, už teď ale přestáváme rozumět, jak vlastně funguje. To je problém

** Už je to tady, lidé přestávají chápat počítače ** Systémy neuronových sítí začínají pracovat tak, že ani jejich tvůrci přesně neví, co se uvnitř děje ** Do budoucna to může být závažný problém

24.  4.  2017 | Jakub Čížek | 112

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

Před 35 lety měl premiéru legendární počítač ZX Spectrum. Připomeňte si „Gumáka“

** Slavný osmibitový počítač Sinclair ZX Spectrum byl uveden právě před 35 lety ** Připomeňte si tento průkopnický počítač v tematických článcích ** Podívejte se, jak funguje dnes

23.  4.  2017 | Pavel Tronner | 13

Správný počítač má alespoň dva monitory. Anebo je to jinak?

Správný počítač má alespoň dva monitory. Anebo je to jinak?

** David si nedokáže představit práci bez dvou a více monitorů ** Kubovi naopak stačí jeden a ve více displejích se ztrácí ** Jaký přístup je lepší?

23.  4.  2017 | Jakub Čížek | 59

Český Google Překladač začal používat umělou inteligenci. Konec „drahoušků zákazníků“

Český Google Překladač začal používat umělou inteligenci. Konec „drahoušků zákazníků“

** Google ve svém překladači roky používal statistickou technologii ** Nyní zavádí strojové učení a neuronové sítě ** Rozdíl by měl být zvláště na větších textech patrný už nyní

20.  4.  2017 | Jakub Čížek | 31

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

Brno otevřelo největší českou dílnu pro bastlíře. Kladívka, vrtačky, 3D tiskárny, laserové řezačky. Je tu vše

** Máte nápad, ale chybí vám stroje a pořádná dílna? ** Chcete postavit ptačí budku, nebo krabičku pro Arduino? ** Brno otevřelo svůj FabLab – laboratoř pro bastlíře

19.  4.  2017 | Jakub Čížek | 31


Aktuální číslo časopisu Computer

První test AMD Ryzen

Velké testy: 22 powerbank a 8 bezdrátových setů

Radíme s koupí Wi-Fi routeru

Co dokáží inteligentní domy?