1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21740 -->
4 <sect2 id="zend.service.windowsazure.storage.table">
5 <title>Zend_Service_WindowsAzure_Storage_Table</title>
8 Der Table Service bietet einen strukturierten Speicher in der Form von Tabellen.
12 Tabellen Speicher wird von Windows Azure als REST API angeboten die von der Klasse
13 <classname>Zend_Service_WindowsAzure_Storage_Table</classname> umhüllt ist um ein natives
14 <acronym>PHP</acronym> Interface zum Speicher Konto zu bieten.
18 Dieses Thema zeigt einige Beispiele der Verwendung der Klasse
19 <classname>Zend_Service_WindowsAzure_Storage_Table</classname>. Andere Features sind im
20 Download Paket enthalten sowie in den detailierten API Dokumentationen dieser Features.
24 Es ist zu beachten das bei der Entwicklung der Tabellen Speicher (in der SDK von Windows
25 Azure) nicht alle Features unterstützt welche von dieser API angeboten werden. Deshalb sind
26 die Beispiele welche auf dieser Seite aufgeführt sind, dazu gedacht auf Windows Azure
27 Produktions Tabellen Speichern verwendet zu werden.
30 <sect3 id="zend.service.windowsazure.storage.table.api">
31 <title>Operationen auf Tabellen</title>
34 Dieses Thema zeigt einige Beispiele für Operationen welche auf Tabellen ausgeführt
38 <sect4 id="zend.service.windowsazure.storage.table.api.create">
39 <title>Erstellung einer Tabelle</title>
42 Bei Verwendung des folgenden Codes, kann eine Tabelle auf dem Windows Azure
43 Produktions Tabellen Speicher erstellt werden.
46 <example id="zend.service.windowsazure.storage.table.api.create.example">
47 <title>Erstellen einer Tabelle</title>
49 <programlisting language="php"><![CDATA[
50 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
51 'table.core.windows.net', 'myaccount', 'myauthkey'
53 $result = $storageClient->createTable('testtable');
55 echo 'Der neue Name der Tabelle ist: ' . $result->Name;
60 <sect4 id="zend.service.windowsazure.storage.table.api.list">
61 <title>Ausgeben aller Tabellen</title>
64 Bei Verwendung des folgendes Codes, kann eine Liste alle Tabellen im Windows Azure
65 Produktions Tabellen Speicher abgefragt werden.
68 <example id="zend.service.windowsazure.storage.table.api.list.example">
69 <title>Ausgeben aller Tabellen</title>
71 <programlisting language="php"><![CDATA[
72 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
73 'table.core.windows.net', 'myaccount', 'myauthkey'
75 $result = $storageClient->listTables();
76 foreach ($result as $table) {
77 echo 'Der Name der Tabelle ist: ' . $table->Name . "\r\n";
84 <sect3 id="zend.service.windowsazure.storage.table.entities">
85 <title>Operationen auf Entitäten</title>
88 Tabellen speichern Daten als Sammlung von Entitäten. Entitäten sind so ähnlich wie
89 Zeilen. Eine Entität hat einen primären Schlüssel und ein Set von Eigenschaften. Eine
90 Eigenschaft ist ein benanntes, Typ-Werte Paar, ähnlich einer Spalte.
94 Der Tabellen Service erzwingt kein Schema für Tabellen, deshalb können zwei Entitäten in
95 der selben Tabelle unterschiedliche Sets von Eigenschaften haben. Entwickler können
96 auswählen das ein Schema auf Seite des Clients erzwungen wird. Eine Tabelle kann eine
97 beliebige Anzahl an Entitäten enthalten.
101 <classname>Zend_Service_WindowsAzure_Storage_Table</classname> bietet 2 Wege um mit
102 Entitäten zu arbeiten:
106 <listitem><para>Erzwungenes Schema</para></listitem>
107 <listitem><para>Nicht erzwungenes Schema</para></listitem>
111 Alle Beispiel verwenden die folgende erwzungene Schema Klasse.
114 <example id="zend.service.windowsazure.storage.table.entities.schema">
115 <title>Erzwungenes Schema welches in Beispielen verwendet wird</title>
117 <programlisting language="php"><![CDATA[
118 class SampleEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
126 * @azure Age Edm.Int64
131 * @azure Visible Edm.Boolean
133 public $Visible = false;
139 Es ist zu beachten das <classname>Zend_Service_WindowsAzure_Storage_Table</classname>,
140 wenn keine Schema Klasse an die Tabellen Speicher Methoden übergeben, automatisch mit
141 <classname>Zend_Service_WindowsAzure_Storage_DynamicTableEntity</classname> arbeitet.
144 <sect4 id="zend.service.windowsazure.storage.table.entities.enforced">
145 <title>Erzwungene Schema Entitäten</title>
148 Um ein Schema auf der Seite des Clients bei Verwendung der Klasse
149 <classname>Zend_Service_WindowsAzure_Storage_Table</classname> zu erzwingen muss
150 eine Klasse erstellt werden welche sich von
151 <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname> ableitet. Diese
152 Klasse bietet einige grundsätzliche Funktionalitäten damit die Klasse
153 <classname>Zend_Service_WindowsAzure_Storage_Table</classname> mit einem
154 client-seitigen Schema arbeitet.
158 Grundsätzliche Eigenschaften welche von
159 <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname> angeboten
166 PartitionKey (durch <methodname>getPartitionKey()</methodname> und
167 <methodname>setPartitionKey()</methodname> bekanntgemacht)
173 RowKey (durch <methodname>getRowKey()</methodname> und
174 <methodname>setRowKey()</methodname> bekanntgemacht)
180 Timestamp (durch <methodname>getTimestamp()</methodname> und
181 <methodname>setTimestamp()</methodname> bekantgemacht)
187 Etag Wert (durch <methodname>getEtag()</methodname> und
188 <methodname>setEtag()</methodname> bekanntgemacht)
194 Hier ist eine Beispielklasse welche sich von
195 <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname> ableitet:
198 <example id="zend.service.windowsazure.storage.table.entities.enforced.schema">
199 <title>Beispiel einer erzwungenen Schema Klasse</title>
201 <programlisting language="php"><![CDATA[
202 class SampleEntity extends Zend_Service_WindowsAzure_Storage_TableEntity
210 * @azure Age Edm.Int64
215 * @azure Visible Edm.Boolean
217 public $Visible = false;
223 Die Klasse <classname>Zend_Service_WindowsAzure_Storage_Table</classname> mappt jede
224 Klasse welche sich von
225 <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname> ableitet auf
226 Windows Azure Tabellen Speicher Entitäten mit dem richtigen Datentyp und dem Namen
227 der Eigenschaft. Alles dort dient dem Speichern einer Eigenschaft in Windows Azure
228 indem ein Docblock Kommentar zu einer öffentlichen Eigenschaft oder einem
229 öffentlichen Getter oder Setter, im folgenden Format hinzugefügt wird:
232 <example id="zend.service.windowsazure.storage.table.entities.enforced.schema-property">
233 <title>Erzwungene Eigenschaft</title>
235 <programlisting language="php"><![CDATA[
237 * @azure <Name der Eigenschaft in Windows Azure> <optionaler Typ der Eigenschaft>
239 public $<Name der Eigenschaft in PHP>;
244 Sehen wir uns an wie eine Eigenschaft "Ago" als Integerwert eines Windows Azure
245 Tabellen Speichers definiert wird:
249 id="zend.service.windowsazure.storage.table.entities.enforced.schema-property-sample">
250 <title>Beispiel einer erzwungenen Eigenschaft</title>
252 <programlisting language="php"><![CDATA[
254 * @azure Age Edm.Int64
261 Es ist zu beachten das die Eigenschaft im Windows Azure Tabellen Speicher nicht
262 notwendigerweise gleich benannt werden muss. Der Name der Windows Azure Tabellen
263 Speicher Eigenschaft kann genauso definiert werden wie der Typ.
267 Die folgenden Datentypen werden unterstützt:
273 <constant>Edm.Binary</constant> - Ein Array von Types welche bis zu 64 KB
280 <constant>Edm.Boolean</constant> - Ein boolscher Wert.
286 <constant>Edm.DateTime</constant> - Ein 64-bit Wert welcher als koordinierte
287 universelle Zeit (UTC) ausgedrückt wird. Der unterstützte DateTime Bereich
288 beginnt an 1. Jänner 1601 A.D. (C.E.), koordinierter Universeller Zeit
289 (UTC). Der Bereich endet am 31. Dezember 9999.
294 <para><constant>Edm.Double</constant> - Eine 64-bit Gleitkommazahl.</para>
299 <constant>Edm.Guid</constant> - Ein 128-bit großer globaler eindeutiger
305 <para><constant>Edm.Int32</constant> - Ein 32-bit Integerwert.</para>
309 <para><constant>Edm.Int64</constant> - Ein 64-bit Integerwert.</para>
314 <constant>Edm.String</constant> - Ein UTF-16-kodierter Wert. Stringwerte
315 können bis zu 64 KB groß sein.
321 <sect4 id="zend.service.windowsazure.storage.table.entities.dynamic">
322 <title>Entitäten ohne erzwungenes Schema (a.k.a. DynamicEntity)</title>
325 Um die Klasse <classname>Zend_Service_WindowsAzure_Storage_Table</classname> ohne
326 Definition eines Schemas zu verwenden kann die Klasse
327 <classname>Zend_Service_WindowsAzure_Storage_DynamicTableEntity</classname>
328 verwendet werden. Diese Klasse erweitert
329 <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname> wie es eine
330 Klasse für ein erzwungenes Schema machen würde, enthält aber zusätzliche Logik um
331 Sie dynamisch zu machen und nicht an ein Schema zu binden.
335 Die grundsätzlichen Eigenschaften welche von
336 <classname>Zend_Service_WindowsAzure_Storage_DynamicTableEntity</classname>
337 angeboten werden sind:
343 PartitionKey (durch <methodname>getPartitionKey()</methodname> und
344 <methodname>setPartitionKey()</methodname> bekanntgemacht)
350 RowKey (durch <methodname>getRowKey()</methodname> und
351 <methodname>setRowKey()</methodname> bekanntgemacht)
357 Timestamp (durch <methodname>getTimestamp()</methodname> und
358 <methodname>setTimestamp()</methodname> bekanntgemacht)
364 Etag Wert (durch <methodname>getEtag()</methodname> und
365 <methodname>setEtag()</methodname> bekanntgemacht)
371 Andere Eigenschaften können on the Fly hinzugefügt werden. Ihre Windows Azure
372 Tabellen Speicher Typen werden auch on the Fly ermittelt:
375 <example id="zend.service.windowsazure.storage.table.entities.dynamic.schema">
377 Eigenschaften zu Zend_Service_WindowsAzure_Storage_DynamicTableEntity dynamisch
381 <programlisting language="php"><![CDATA[
382 $target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(
383 'partition1', '000001'
385 $target->Name = 'Name'; // Fügt die Eigenschaft "Name" vom Typ "Edm.String" hinzu
386 $target->Age = 25; // Fügt die Eigenschaft "Age" vom Typ "Edm.Int32" hinzu
391 Optional kann der Typ einer Eigenschaft erzwungen werden:
395 id="zend.service.windowsazure.storage.table.entities.dynamic.schema-forcedproperties">
397 Erzwingen von Eigenschaftstypen auf
398 Zend_Service_WindowsAzure_Storage_DynamicTableEntity
401 <programlisting language="php"><![CDATA[
402 $target = new Zend_Service_WindowsAzure_Storage_DynamicTableEntity(
403 'partition1', '000001'
405 $target->Name = 'Name'; // Fügt die Eigenschaft "Name" vom Typ "Edm.String" hinzu
406 $target->Age = 25; // Fügt die Eigenschaft "Age" vom Typ "Edm.Int32" hinzu
408 // Ändert den Typ der Eigenschaft "Age" auf "Edm.Int32":
409 $target->setAzurePropertyType('Age', 'Edm.Int64');
414 Die Klasse <classname>Zend_Service_WindowsAzure_Storage_Table</classname> arbeitet
415 automatisch mit <classname>Zend_Service_WindowsAzure_Storage_TableEntity</classname>
416 wenn an die Tabellen Speicher Methoden keine spezielle Klasse übergeben wurde.
420 <sect4 id="zend.service.windowsazure.storage.table.entities.api">
421 <title>API Beispiele für Entitäten</title>
423 <sect5 id="zend.service.windowsazure.storage.table.entities.api.insert">
424 <title>Eine Entität hinzufügen</title>
427 Bei Verwendung des folgenden Codes kann eine Entität in eine Tabelle hinzugefügt
428 werden welche "testtable" heißt. Es ist zu beachten das die Tabelle vorher schon
429 erstellt worden sein muss.
432 <example id="zend.service.windowsazure.storage.table.api.entities.insert.example">
433 <title>Eine Entität einfügen</title>
435 <programlisting language="php"><![CDATA[
436 $entity = new SampleEntity ('partition1', 'row1');
437 $entity->FullName = "Maarten";
439 $entity->Visible = true;
441 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
442 'table.core.windows.net', 'myaccount', 'myauthkey'
444 $result = $storageClient->insertEntity('testtable', $entity);
446 // Prüfen des Zeitpunktes und von Etag der neu erstellten Entität
447 echo 'Zeitpunkt: ' . $result->getTimestamp() . "\n";
448 echo 'Etag: ' . $result->getEtag() . "\n";
453 <sect5 id="zend.service.windowsazure.storage.table.entities.api.retrieve-by-id">
454 <title>Empfangen einer Entität durch Partitionsschlüssel und Zeilenschlüssel</title>
457 Durch Verwendung des folgenden Codes kann eine Entität durch seinen
458 Partitions- und Zeilenschlüssel. Es ist zu beachten das die Tabelle und die
459 Entität bereits vorher erstellt worden sein müssen.
463 id="zend.service.windowsazure.storage.table.entities.api.retrieve-by-id.example">
465 Empfangen einer Entität durch dessen Partitions- und Zeilenschlüssel
468 <programlisting language="php"><![CDATA[
469 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
470 'table.core.windows.net', 'myaccount', 'myauthkey'
472 $entity= $storageClient->retrieveEntityById(
473 'testtable', 'partition1', 'row1', 'SampleEntity'
479 <sect5 id="zend.service.windowsazure.storage.table.entities.api.updating">
480 <title>Eine Entität aktualisieren</title>
483 Bei Verwendung des folgenden Codes kann eine Entität aktualisiert werden. Es ist
484 zu beachten das die Tabelle und die Entität hierfür bereits vorher erstellt
488 <example id="zend.service.windowsazure.storage.table.api.entities.updating.example">
489 <title>Aktualisieren einer Entität</title>
491 <programlisting language="php"><![CDATA[
492 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
493 'table.core.windows.net', 'myaccount', 'myauthkey'
495 $entity = $storageClient->retrieveEntityById(
496 'testtable', 'partition1', 'row1', 'SampleEntity'
499 $entity->Name = 'Neuer Name';
500 $result = $storageClient->updateEntity('testtable', $entity);
505 Wenn man sicherstellen will das die Entität vorher noch nicht aktualisiert wurde
506 kann man prüfen ob das <acronym>Etag</acronym> der Entität angehakt ist. Wenn
507 die Entität bereits aktualisiert wurde, schlägt das Update fehl um
508 sicherzustellen das neuere Daten nicht überschrieben werden.
512 id="zend.service.windowsazure.storage.table.entities.api.updating.example-etag">
513 <title>Aktualisieren einer Entität (mit Etag Prüfung)</title>
515 <programlisting language="php"><![CDATA[
516 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
517 'table.core.windows.net', 'myaccount', 'myauthkey'
519 $entity = $storageClient->retrieveEntityById(
520 'testtable', 'partition1', 'row1', 'SampleEntity'
523 $entity->Name = 'Neuer Name';
525 // Der letzte Parameter instruiert den Etag Check:
526 $result = $storageClient->updateEntity('testtable', $entity, true);
531 <sect5 id="zend.service.windowsazure.storage.table.entities.api.delete">
532 <title>Löschen einer Entität</title>
535 Bei Verwendung des folgenden Codes kann eine Entität gelöscht werden. Es ist zu
536 beachten das die Tabelle und die Entität hierfür bereits erstellt worden sein
540 <example id="zend.service.windowsazure.storage.table.entities.api.delete.example">
541 <title>Löschen einer Entität</title>
543 <programlisting language="php"><![CDATA[
544 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
545 'table.core.windows.net', 'myaccount', 'myauthkey'
547 $entity = $storageClient->retrieveEntityById(
548 'testtable', 'partition1', 'row1', 'SampleEntity'
550 $result = $storageClient->deleteEntity('testtable', $entity);
556 <sect4 id="zend.service.windowsazure.storage.table.entities.querying">
557 <title>Durchführen von Abfragen</title>
560 Abfragen im <classname>Zend_Service_WindowsAzure_Storage_Table</classname> Tabellen
561 Speicher können auf zwei Wegen durchgeführt werden:
567 Durch manuelles Erstellen einer Filter Kondition (was das Lernen einer neuen
568 Abfrage Sprache beinhaltet)
574 Durch Verwendung des fluent Interfaces welches von
575 <classname>Zend_Service_WindowsAzure_Storage_Table</classname> angeboten
582 Bei Verwendung des folgenden Codes kann eine Tabelle abgefragt werden indem eine
583 Filter Kondition verwendet wird. Es ist zu beachten das die Tabelle und die
584 Entitäten hierfür vorher bereits erstellt worden sein müssen.
587 <example id="zend.service.windowsazure.storage.table.entities.querying.query-filter">
588 <title>Durchführen einer Abfrage bei Verwendung einer Filter Kondition</title>
590 <programlisting language="php"><![CDATA[
591 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
592 'table.core.windows.net', 'myaccount', 'myauthkey'
594 $entities = $storageClient->storageClient->retrieveEntities(
596 'Name eq \'Maarten\' and PartitionKey eq \'partition1\'',
600 foreach ($entities as $entity) {
601 echo 'Name: ' . $entity->Name . "\n";
607 Durch Verwendung des folgenden Codes kann eine tabelle abgefragt werden indem ein
608 fluid Interface verwendet wird. Es ist zu beachten das die Tabelle und die
609 Entität hierfür bereits vorher erstellt worden sein müssen.
612 <example id="zend.service.windowsazure.storage.table.api.entities.query-fluent">
613 <title>Durchführen einer Abfrage bei Verwendung eines Fluid Interfaces</title>
615 <programlisting language="php"><![CDATA[
616 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
617 'table.core.windows.net', 'myaccount', 'myauthkey'
619 $entities = $storageClient->storageClient->retrieveEntities(
621 $storageClient->select()
623 ->where('Name eq ?', 'Maarten')
624 ->andWhere('PartitionKey eq ?', 'partition1'),
628 foreach ($entities as $entity) {
629 echo 'Name: ' . $entity->Name . "\n";
635 <sect4 id="zend.service.windowsazure.storage.table.entities.batch">
636 <title>Batch Operationen</title>
639 Dieser Abschnitt demonstriert wie die Tabellen Entitäts Gruppen Transaktions
640 Features verwendet werden können welche vom Windows Azure Tabellen Speicher
641 angeboten werden. Der Windows Azure Tabellen Speicher unterstützt Batch
642 Transaktionen auf Entitäten welche in der gleichen Tabelle sind und der gleichen
643 Partitionsgruppe angehören. Eine Transaktion kann bis zu 100 Entitäten enthalten.
647 Das folgende Beispiel verwendet eine Batch Operation (Transaktion) um ein Set von
648 Entitäten in die Tabelle "testtable" einzufügen. Es ist zu beachten das die Tabelle
649 hierfür bereits vorher erstellt worden sein muss.
652 <example id="zend.service.windowsazure.storage.table.api.batch">
653 <title>Ausführen einer Batch Operation</title>
655 <programlisting language="php"><![CDATA[
656 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
657 'table.core.windows.net', 'myaccount', 'myauthkey'
661 $batch = $storageClient->startBatch();
663 // Entitäten mit Batch einfügen
664 $entities = generateEntities();
665 foreach ($entities as $entity) {
666 $storageClient->insertEntity($tableName, $entity);
676 <sect3 id="zend.service.windowsazure.storage.table.sessionhandler">
677 <title>Session Handler für Tabellen Speicher</title>
680 Wenn eine <acronym>PHP</acronym> Anwendung auf der Windows Azure Plattform in einem
681 Load-Balanced Modus läuft (wenn 2 oder mehr Web Rollen Instanzen laufen), ist es
682 wichtig dass <acronym>PHP</acronym> Session Daten zwischen mehreren Web Rollen Instanzen
683 verwendet werden können. Die Windows Azure SDK von <acronym>PHP</acronym> bietet die
684 Klasse <classname>Zend_Service_WindowsAzure_SessionHandler</classname> an welche den
685 Windows Azure Tabellen Speicher als Session Handler für <acronym>PHP</acronym>
686 Anwendungen verwendet.
690 Um den <classname>Zend_Service_WindowsAzure_SessionHandler</classname> Session Handler
691 zu verwenden sollte er als Default Session Handler für die <acronym>PHP</acronym>
692 Anwendung registriert sein:
695 <example id="zend.service.windowsazure.storage.table.api.sessionhandler-register">
696 <title>Registrierung des Tabellen Speicher Session Handlers</title>
698 <programlisting language="php"><![CDATA[
699 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
700 'table.core.windows.net', 'myaccount', 'myauthkey'
703 $sessionHandler = new Zend_Service_WindowsAzure_SessionHandler(
704 $storageClient , 'sessionstable'
706 $sessionHandler->register();
711 Der obenstehende Klassenname registriert den
712 <classname>Zend_Service_WindowsAzure_SessionHandler</classname> Session Handler und
713 speichert Sessions in einer Tabelle die "sessionstable" genannt wird.
717 Nach der Registrierung des
718 <classname>Zend_Service_WindowsAzure_SessionHandler</classname> Session Handlers
719 können Session gestartet und auf dem gleichen Weg wie normale <acronym>PHP</acronym>
720 Sessions verwendet werden:
723 <example id="zend.service.windowsazure.storage.table.api.sessionhandler-usage">
724 <title>Verwendung des Tabellen Speicher Session Handlers</title>
726 <programlisting language="php"><![CDATA[
727 $storageClient = new Zend_Service_WindowsAzure_Storage_Table(
728 'table.core.windows.net', 'myaccount', 'myauthkey'
731 $sessionHandler = new Zend_Service_WindowsAzure_SessionHandler(
732 $storageClient , 'sessionstable'
734 $sessionHandler->register();
738 if (!isset($_SESSION['firstVisit'])) {
739 $_SESSION['firstVisit'] = time();
748 Der <classname>Zend_Service_WindowsAzure_SessionHandler</classname> Session Handler
749 sollte registriert werden bevor ein Aufruf zu
750 <methodname>session_start()</methodname> durchgeführt wird!