| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.service.amazon.s3">
- <title>Zend_Service_Amazon_S3</title>
- <sect2 id="zend.service.amazon.s3.introduction">
- <title>Einführung</title>
- <para>
- Amazon S3 bietet ein einfaches Webservice Interface das verwendet werden kann um
- beliebige Mengen an Daten, jederzeit und von überall her aus dem Web, zu Speichern und
- erhalten. Es gibt Entwicklern den Zugriff auf die gleiche, hoch skalierbare,
- verfügbare, schnelle und kostengünstige Datenspeicher Infrastruktur die Amazon
- verwendet um sein eigenes globales Netzwerk an Websites zu betreiben. Der Service
- zielt darauf ab den Nutzen der Skalierbarkeit zu erhöhen und diese Vorteile an
- Entwickler weiterzugeben.
- </para>
- </sect2>
- <sect2 id="zend.service.amazon.s3.registering">
- <title>Registrierung mit Amazon S3</title>
- <para>
- Bevor man mit <classname>Zend_Service_Amazon_S3</classname> beginnen kann, muß man einen
- Account registrieren. Sehen Sie bitte auf die Amazon Website
- <ulink url="http://aws.amazon.com/s3/faqs/">S3 FAQ</ulink> für weitere Informationen.
- </para>
- <para>
- Nach der Registrierung erhält man einen Anwendungsschlüssel und einen geheimen
- Schlüssel. Man benötigt beide um auf den S3 Service zugreifen zu können.
- </para>
- </sect2>
- <sect2 id="zend.service.amazon.s3.apiDocumentation">
- <title>API Dokumentation</title>
- <para>
- Die Klasse <classname>Zend_Service_Amazon_S3</classname> bietet einen
- <acronym>PHP</acronym> Wrapper zum Amazon S3 REST Interface. Schauen Sie bitte in die
- <ulink
- url="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=48">Amazon
- S3 Dokumentation</ulink> für eine detailierte Beschreibung des Services. Man muß mit
- dem grundsätzlichen Konzept vertraut sein um dieses Service nutzen zu können.
- </para>
- </sect2>
- <sect2 id="zend.service.amazon.s3.features">
- <title>Features</title>
- <para>
- <classname>Zend_Service_Amazon_S3</classname> bietet die folgenden Funktionalitäten:
- <itemizedlist>
- <listitem>
- <para>
- Einen einzelnen Punkt für die Konfiguration der eigenen amazon.s3
- Zugangsdaten der über dem kompletten amazon.s3 Namespace verwendet werden
- kann.
- </para>
- </listitem>
- <listitem>
- <para>
- Ein Proxy Objekt das bequemer zu verwenden ist als ein
- <acronym>HTTP</acronym> Client alleine, da er hauptsächlich die
- Notwendigkeit eliminiert manuell eine <acronym>HTTP</acronym> POST Anfrage
- über den REST Service zu erstellen.
- </para>
- </listitem>
- <listitem>
- <para>
- Ein Antwort-Wrapper der jede Antwort erhebt und eine Exception wirft wenn
- ein Fehler aufgetreten ist, was die Notwendigkeit eliminiert den Erfolg
- vieler Kommandos wiederholt zu prüfen.
- </para>
- </listitem>
- <listitem>
- <para>
- Zusätzliche bequeme Methoden für einige der üblicheren Operationen.
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
- <sect2 id="zend.service.amazon.s3.storing-your-first">
- <title>Beginnen wir</title>
- <para>
- Sobald man sich mit Amazon S3 registriert hat, ist man bereit sein erstes Objekt auf
- S3 zu speichern. Die Objekte werden auf S3 in Containern gespeichert, die "Buckets"
- genannt werden. Der Name der Buckets ist auf S3 eindeutig, und jeder Benutzer kann
- nicht mehr als 100 Buckets simultan besitzen. Jeder Bucket kann eine unlimitierte
- Anzahl an Objekten enthalten, die durch den Namen identifiziert werden.
- </para>
- <para>
- Das folgende Beispiel demonstriert die Erstellung eines Buckets, und das Speichern und
- Empfangen von Daten.
- </para>
- <example id="zend.service.amazon.s3.storing-your-first.example">
- <title>Beispiel der Verwendung von Zend_Service_Amazon_S3</title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $s3->createBucket("my-own-bucket");
- $s3->putObject("my-own-bucket/myobject", "somedata");
- echo $s3->getObject("my-own-bucket/myobject");
- ]]></programlisting>
- </example>
- <para>
- Da der <classname>Zend_Service_Amazon_S3</classname> Service eine Authentifizierung
- benötigt, sollte man seine Zugangsdaten (AWS Schlüssel und Geheimschlüssel) an den
- Konstruktor übergeben. Wenn man nur einen Account verwendet, kann man
- Standard-Zugangsdaten für das Service setzen:
- </para>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- Zend_Service_Amazon_S3::setKeys($my_aws_key, $my_aws_secret_key);
- $s3 = new Zend_Service_Amazon_S3();
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.service.amazon.s3.buckets">
- <title>Bucket Operationen</title>
- <para>
- Alle Objekte im S3 System werden in Buckets gespeichert. Buckets müssen erstellt werden
- bevor Speicheroperationen durchgeführt werden. Der Name des Buckets ist im System
- eindeutig, so das man den Bucket nicht so benennen kann wie den Bucket einer anderen
- Person.
- </para>
- <para>
- Namen von Buckets können Kleinbuchstaben, Ziffern, Punkte (.), Unterstriche (_), und
- Bindestriche (-) enthalten. Es sind keine anderen Symbole erlaubt. Bucketnamen sollten
- mit einem Buchstaben oder einer Ziffer beginnen, und 3 bis 255 Zeichen lang sein.
- Namen die wie eine IP Adresse aussehen (z.B. "192.168.16.255") sind nicht erlaubt.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>createBucket()</methodname> erstellt einen neuen Bucket.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>cleanBucket()</methodname> entfernt alle Objekte die in einem Bucket
- enthalten sind.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeBucket()</methodname> entfernt den Bucket vom System. Der
- Bucket sollte leer sein damit er entfernt werden kann.
- </para>
- <example id="zend.service.amazon.s3.buckets.remove.example">
- <title>
- Beispiel für das Entfernen eines Buckets in Zend_Service_Amazon_S3
- </title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $s3->cleanBucket("my-own-bucket");
- $s3->removeBucket("my-own-bucket");
- ]]></programlisting>
- </example>
- </listitem>
- <listitem>
- <para>
- <methodname>getBuckets()</methodname> gibt eine Liste der Namen aller Buckets
- zurück die einem Benutzer gehören.
- </para>
- <example id="zend.service.amazon.s3.buckets.list.example">
- <title>Beispiel für das Auflisten der Buckets in Zend_Service_Amazon_S3</title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $list = $s3->getBuckets();
- foreach($list as $bucket) {
- echo "Ich habe das Bucket $bucket\n";
- }
- ]]></programlisting>
- </example>
- </listitem>
- <listitem>
- <para>
- <methodname>isBucketAvailable()</methodname> prüft ob das Bucket existiert und
- gibt <constant>TRUE</constant> zurück wenn das der Fall ist.
- </para>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.service.amazon.s3.objects">
- <title>Operationen am Objekt</title>
- <para>
- Das Objekte ist die grundsätzliche Speichereinheit in S3. Objekte speichern nicht
- strukturierte Daten, welche jede Größe, bis zu 4 Gigabyte, haben können. Es gibt kein
- Limit in der Anzahl der Objekte die auf dem System gespeichert werden können.
- </para>
- <para>
- Objekte werden in Buckets abgelegt. Sie werden durch den Namen identifiziert, der
- jeder UTF-8 String sein kann. Es ist üblich hierarchische Namen zu verwenden (wie z.B.
- <code>Pictures/Myself/CodingInPHP.jpg</code> um Objektnamen zu organisieren.
- Objektnamen wird der Bucketname vorangestellt wenn Objektfunktionen verwendet werden,
- so dass das Objekt "mydata" im Bucket "my-own-bucket" den Namen
- <code>my-own-bucket/mydata</code> haben würde.
- </para>
- <para>
- Objekte können ersetzt (durch Überschreiben neuer Daten mit dem gleichen Schlüssel)
- oder gelöscht werden, aber nicht geändert, angefügt, usw. Objekte werden immer als
- Ganzes gespeichert.
- </para>
- <para>
- Standardmäßig sind alle Objekte privat und es kann nur durch Ihren Besitzer auf Sie
- zugegriffen werden. Trotzdem ist es möglich Objekte mit öffentlichem Zugriff zu
- spezifizieren, wodurch man auf Sie mit der folgenden <acronym>URL</acronym> zugreifen
- kann: <code>http://s3.amazonaws.com/[bucket-name]/[object-name]</code>.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>putObject($object, $data, $meta)</methodname> erstellt ein Objekt
- mit dem Namen <varname>$object</varname> (Sollte den Bucketnamen als Präfix
- enthalten!) das <varname>$data</varname> als seinen Inhalt besitzt.
- </para>
- <para>
- Der optionale <varname>$meta</varname> Parameter ist das Array von Metadaten,
- welches aktuell die folgenden Schlüssel enthalten kann:
- </para>
- <variablelist>
- <varlistentry>
- <term><constant>S3_CONTENT_TYPE_HEADER</constant></term>
- <listitem>
- <para>
- <acronym>MIME</acronym> Content Type der Daten. Wenn nicht
- angegeben, wird der Typ anhand der Dateiextension des Objektnamens
- geschätzt.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><constant>S3_ACL_HEADER</constant></term>
- <listitem>
- <para>
- Der Zugriff auf das Element. Folgende Zugriffskonstanten können
- verwendet werden:
- <variablelist>
- <varlistentry>
- <term><constant>S3_ACL_PRIVATE</constant></term>
- <listitem>
- <para>
- Nur der Besitzer hat auf das Element Zugriff.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><constant>S3_ACL_PUBLIC_READ</constant></term>
- <listitem>
- <para>
- Jeder kann das Objekt lesen, aber nur der Besitzer
- kann schreiben. Diese Eigenschaft kann verwendet
- werden um öffentlich zugängliche Inhalte zu
- speichern.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><constant>S3_ACL_PUBLIC_WRITE</constant></term>
- <listitem>
- <para>
- Jeder kann das Objekt schreiben oder lesen. Diese
- Eigenschaft sollte sehr spärlich verwendet werden.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><constant>S3_ACL_AUTH_READ</constant></term>
- <listitem>
- <para>
- Nur der Besitzer hat Schreibzugriff auf das
- Element, und andere authentifizierte S3 Benutzer
- haben Leserechte. Das ist nützlich um Daten
- zwischen S3 Accounts zu teilen ohne Sie der
- Öffentlichkeit zugänglich zu machen.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- Standardmäßig sind alle diese Elemente privat.
- </para>
- <example id="zend.service.amazon.s3.objects.public.example">
- <title>
- Beispiel für ein öffentliches Objekt in Zend_Service_Amazon_S3
- </title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $s3->putObject("my-own-bucket/Pictures/Me.png", file_get_contents("me.png"),
- array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
- Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
- // oder:
- $s3->putFile("me.png", "my-own-bucket/Pictures/Me.png",
- array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
- Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
- echo "Go to http://s3.amazonaws.com/my-own-bucket/Pictures/Me.png to see me!\n";
- ]]></programlisting>
- </example>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- <listitem>
- <para>
- <methodname>getObject($object)</methodname> empfängt Objektdaten vom Speicher
- anhand des Namens.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeObject($object)</methodname> entfernt das Objekt vom Speicher.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getInfo($object)</methodname> empfängt die Metadaten des Objekts.
- Diese Funktion gibt ein Array mit Metadaten zurück. Einige der nützlichen
- Schlüssel sind:
- <variablelist>
- <varlistentry>
- <term><code>type</code></term>
- <listitem>
- <para>Der <acronym>MIME</acronym> Typ des Elements.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><code>size</code></term>
- <listitem><para>Die Größe der Objektdaten.</para></listitem>
- </varlistentry>
- <varlistentry>
- <term><code>mtime</code></term>
- <listitem>
- <para>
- UNIX-artiger Zeitstempel der letzten Änderung für das Objekt.
- </para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term><code>etag</code></term>
- <listitem>
- <para>
- Das ETag der Daten, welches ein MD5 Hash der Daten ist,
- eingeklammert von Hochkomma (").
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
- Die Funktion gibt <constant>FALSE</constant> zurück wenn der Schlüssel keinem
- der existierenden Objekte entspricht.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getObjectsByBucket($bucket)</methodname> gibt eine Liste der
- Objektschlüssel zurüc, die im Bucket enthalten sind.
- </para>
- <example id="zend.service.amazon.s3.objects.list.example">
- <title>Beispiel für die Auflistung eines Zend_Service_Amazon_S3 Objekts</title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $list = $s3->getObjectsByBucket("my-own-bucket");
- foreach($list as $name) {
- echo "Ich habe $name Schlüssel:\n";
- $data = $s3->getObject("my-own-bucket/$name");
- echo "with data: $data\n";
- }
- ]]></programlisting>
- </example>
- </listitem>
- <listitem>
- <para>
- <methodname>isObjectAvailable($object)</methodname> prüft ob das Objekt mit dem
- angegebenen Namen existiert.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>putFile($path, $object, $meta)</methodname> fügt den Inhalt der
- Datei unter <varname>$path</varname> in das Objekt mit dem Namen
- <varname>$object</varname> ein.
- </para>
- <para>
- Das optionale Argument <varname>$meta</varname> ist das gleiche wie für
- <code>putObject</code>. Wenn der Content-Typ nicht angegeben wird, wird er
- anhand des Dateinamens vermutet.
- </para>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.service.amazon.s3.streaming">
- <title>Daten Streamen</title>
- <para>
- Es ist möglich Objekte zu Holen und Setzen wobei keine Stream Daten verwendet werden die
- im Speicher sind, sondern Dateien oder <acronym>PHP</acronym> Streams. Das ist Speziell
- dann nützlich wenn Dateien sehr groß sind um nicht über Speichergrenzen zu kommen.
- </para>
- <para>
- Um ein Objekt mit Streaming zu Empfangen muss die Methode
- <methodname>getObjectStream($object, $filename)</methodname> verwendet werden. Diese
- Methode gibt einen <classname>Zend_Http_Response_Stream</classname> zurück, welcher wie
- im Kapitel <link linkend="zend.http.client.streaming">HTTP Client Daten Streaming</link>
- verwendet werden kann.
- <example id="zend.service.amazon.s3.streaming.example1">
- <title>Beispiel für das Streamen von Daten mit Zend_Service_Amazon_S3</title>
- <programlisting language="php"><![CDATA[
- $response = $amazon->getObjectStream("mybycket/zftest");
- // Datei kopieren
- copy($response->getStreamName(), "my/downloads/file");
- // Hinauf Streamen
- $fp = fopen("my/downloads/file2", "w");
- stream_copy_to_stream($response->getStream(), $fp);
- ]]></programlisting>
- </example>
- </para>
- <para>
- Der zweite Parameter für <methodname>getObjectStream()</methodname> ist optional und
- spezifiziert die Zieldatei in welche die dAten geschrieben werden. Wenn er nicht
- spezifiziert ist, wird eine temporäre Datei verwendet. Diese wird gelöscht nachdem das
- Antwort-Objekt gelöscht wurde.
- </para>
- <para>
- Um ein Objekt mit Streaming zu Senden kann <methodname>putFileStream()</methodname>
- verwendet werden. Es hat die gleiche Signatur wie <methodname>putFile()</methodname>
- verwendet aber Streaming und liest die Datei nicht in den Speicher ein.
- </para>
- <para>
- Man kann auch eine Stream Ressource an die <methodname>putObject()</methodname> Methode
- als Daten Parameter übergeben. In diesem Fall werden die Daten vom Stream gelesen wenn
- die Anfrage an den Server gesendet wird.
- </para>
- </sect2>
- <sect2 id="zend.service.amazon.s3.streams">
- <title>Stream wrapper</title>
- <para>
- Zusätzlich zum oben beschriebenen Interface unterstützt
- <classname>Zend_Service_Amazon_S3</classname> das Arbeiten als Stream Wrapper. Hierfür
- muß das Client-Objekt als Stream Wrapper registriert werden:
- </para>
- <example id="zend.service.amazon.s3.streams.example">
- <title>Beispiel für Streams mit Zend_Service_Amazon_S3</title>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Service/Amazon/S3.php';
- $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
- $s3->registerStreamWrapper("s3");
- mkdir("s3://my-own-bucket");
- file_put_contents("s3://my-own-bucket/testdata", "mydata");
- echo file_get_contents("s3://my-own-bucket/testdata");
- ]]></programlisting>
- </example>
- <para>
- Die Verzeichnis-Operationen (<code>mkdir</code>, <code>rmdir</code>,
- <code>opendir</code>, usw.) werden an Buckets ausgeführt und deshalb sollten deren
- Argumente in der Form <code>s3://bucketname</code> angegeben werden. Dateioperationen
- werden an Objekten ausgeführt. Objekt Erstellung, Lesen, Schreiben, Löschen, Stat und
- Anzeigen von Verzeichnissen wird unterstützt.
- </para>
- </sect2>
- </sect1>
|