2
0

Zend_Service_Amazon_S3.xml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.service.amazon.s3">
  5. <title>Zend_Service_Amazon_S3</title>
  6. <sect2 id="zend.service.amazon.s3.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. Amazon S3 bietet ein einfaches Webservice Interface das verwendet werden kann um
  10. beliebige Mengen an Daten, jederzeit und von überall her aus dem Web, zu Speichern und
  11. erhalten. Es gibt Entwicklern den Zugriff auf die gleiche, hoch skalierbare,
  12. verfügbare, schnelle und kostengünstige Datenspeicher Infrastruktur die Amazon
  13. verwendet um sein eigenes globales Netzwerk an Websites zu betreiben. Der Service
  14. zielt darauf ab den Nutzen der Skalierbarkeit zu erhöhen und diese Vorteile an
  15. Entwickler weiterzugeben.
  16. </para>
  17. </sect2>
  18. <sect2 id="zend.service.amazon.s3.registering">
  19. <title>Registrierung mit Amazon S3</title>
  20. <para>
  21. Bevor man mit <classname>Zend_Service_Amazon_S3</classname> beginnen kann, muß man einen
  22. Account registrieren. Sehen Sie bitte auf die Amazon Website
  23. <ulink url="http://aws.amazon.com/s3/faqs/">S3 FAQ</ulink> für weitere Informationen.
  24. </para>
  25. <para>
  26. Nach der Registrierung erhält man einen Anwendungsschlüssel und einen geheimen
  27. Schlüssel. Man benötigt beide um auf den S3 Service zugreifen zu können.
  28. </para>
  29. </sect2>
  30. <sect2 id="zend.service.amazon.s3.apiDocumentation">
  31. <title>API Dokumentation</title>
  32. <para>
  33. Die Klasse <classname>Zend_Service_Amazon_S3</classname> bietet einen
  34. <acronym>PHP</acronym> Wrapper zum Amazon S3 REST Interface. Schauen Sie bitte in die
  35. <ulink
  36. url="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=48">Amazon
  37. S3 Dokumentation</ulink> für eine detailierte Beschreibung des Services. Man muß mit
  38. dem grundsätzlichen Konzept vertraut sein um dieses Service nutzen zu können.
  39. </para>
  40. </sect2>
  41. <sect2 id="zend.service.amazon.s3.features">
  42. <title>Features</title>
  43. <para>
  44. <classname>Zend_Service_Amazon_S3</classname> bietet die folgenden Funktionalitäten:
  45. <itemizedlist>
  46. <listitem>
  47. <para>
  48. Einen einzelnen Punkt für die Konfiguration der eigenen amazon.s3
  49. Zugangsdaten der über dem kompletten amazon.s3 Namespace verwendet werden
  50. kann.
  51. </para>
  52. </listitem>
  53. <listitem>
  54. <para>
  55. Ein Proxy Objekt das bequemer zu verwenden ist als ein
  56. <acronym>HTTP</acronym> Client alleine, da er hauptsächlich die
  57. Notwendigkeit eliminiert manuell eine <acronym>HTTP</acronym> POST Anfrage
  58. über den REST Service zu erstellen.
  59. </para>
  60. </listitem>
  61. <listitem>
  62. <para>
  63. Ein Antwort-Wrapper der jede Antwort erhebt und eine Exception wirft wenn
  64. ein Fehler aufgetreten ist, was die Notwendigkeit eliminiert den Erfolg
  65. vieler Kommandos wiederholt zu prüfen.
  66. </para>
  67. </listitem>
  68. <listitem>
  69. <para>
  70. Zusätzliche bequeme Methoden für einige der üblicheren Operationen.
  71. </para>
  72. </listitem>
  73. </itemizedlist>
  74. </para>
  75. </sect2>
  76. <sect2 id="zend.service.amazon.s3.storing-your-first">
  77. <title>Beginnen wir</title>
  78. <para>
  79. Sobald man sich mit Amazon S3 registriert hat, ist man bereit sein erstes Objekt auf
  80. S3 zu speichern. Die Objekte werden auf S3 in Containern gespeichert, die "Buckets"
  81. genannt werden. Der Name der Buckets ist auf S3 eindeutig, und jeder Benutzer kann
  82. nicht mehr als 100 Buckets simultan besitzen. Jeder Bucket kann eine unlimitierte
  83. Anzahl an Objekten enthalten, die durch den Namen identifiziert werden.
  84. </para>
  85. <para>
  86. Das folgende Beispiel demonstriert die Erstellung eines Buckets, und das Speichern und
  87. Empfangen von Daten.
  88. </para>
  89. <example id="zend.service.amazon.s3.storing-your-first.example">
  90. <title>Beispiel der Verwendung von Zend_Service_Amazon_S3</title>
  91. <programlisting language="php"><![CDATA[
  92. require_once 'Zend/Service/Amazon/S3.php';
  93. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  94. $s3->createBucket("my-own-bucket");
  95. $s3->putObject("my-own-bucket/myobject", "somedata");
  96. echo $s3->getObject("my-own-bucket/myobject");
  97. ]]></programlisting>
  98. </example>
  99. <para>
  100. Da der <classname>Zend_Service_Amazon_S3</classname> Service eine Authentifizierung
  101. benötigt, sollte man seine Zugangsdaten (AWS Schlüssel und Geheimschlüssel) an den
  102. Konstruktor übergeben. Wenn man nur einen Account verwendet, kann man
  103. Standard-Zugangsdaten für das Service setzen:
  104. </para>
  105. <programlisting language="php"><![CDATA[
  106. require_once 'Zend/Service/Amazon/S3.php';
  107. Zend_Service_Amazon_S3::setKeys($my_aws_key, $my_aws_secret_key);
  108. $s3 = new Zend_Service_Amazon_S3();
  109. ]]></programlisting>
  110. </sect2>
  111. <sect2 id="zend.service.amazon.s3.buckets">
  112. <title>Bucket Operationen</title>
  113. <para>
  114. Alle Objekte im S3 System werden in Buckets gespeichert. Buckets müssen erstellt werden
  115. bevor Speicheroperationen durchgeführt werden. Der Name des Buckets ist im System
  116. eindeutig, so das man den Bucket nicht so benennen kann wie den Bucket einer anderen
  117. Person.
  118. </para>
  119. <para>
  120. Namen von Buckets können Kleinbuchstaben, Ziffern, Punkte (.), Unterstriche (_), und
  121. Bindestriche (-) enthalten. Es sind keine anderen Symbole erlaubt. Bucketnamen sollten
  122. mit einem Buchstaben oder einer Ziffer beginnen, und 3 bis 255 Zeichen lang sein.
  123. Namen die wie eine IP Adresse aussehen (z.B. "192.168.16.255") sind nicht erlaubt.
  124. </para>
  125. <itemizedlist>
  126. <listitem>
  127. <para>
  128. <methodname>createBucket()</methodname> erstellt einen neuen Bucket.
  129. </para>
  130. </listitem>
  131. <listitem>
  132. <para>
  133. <methodname>cleanBucket()</methodname> entfernt alle Objekte die in einem Bucket
  134. enthalten sind.
  135. </para>
  136. </listitem>
  137. <listitem>
  138. <para>
  139. <methodname>removeBucket()</methodname> entfernt den Bucket vom System. Der
  140. Bucket sollte leer sein damit er entfernt werden kann.
  141. </para>
  142. <example id="zend.service.amazon.s3.buckets.remove.example">
  143. <title>
  144. Beispiel für das Entfernen eines Buckets in Zend_Service_Amazon_S3
  145. </title>
  146. <programlisting language="php"><![CDATA[
  147. require_once 'Zend/Service/Amazon/S3.php';
  148. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  149. $s3->cleanBucket("my-own-bucket");
  150. $s3->removeBucket("my-own-bucket");
  151. ]]></programlisting>
  152. </example>
  153. </listitem>
  154. <listitem>
  155. <para>
  156. <methodname>getBuckets()</methodname> gibt eine Liste der Namen aller Buckets
  157. zurück die einem Benutzer gehören.
  158. </para>
  159. <example id="zend.service.amazon.s3.buckets.list.example">
  160. <title>Beispiel für das Auflisten der Buckets in Zend_Service_Amazon_S3</title>
  161. <programlisting language="php"><![CDATA[
  162. require_once 'Zend/Service/Amazon/S3.php';
  163. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  164. $list = $s3->getBuckets();
  165. foreach($list as $bucket) {
  166. echo "Ich habe das Bucket $bucket\n";
  167. }
  168. ]]></programlisting>
  169. </example>
  170. </listitem>
  171. <listitem>
  172. <para>
  173. <methodname>isBucketAvailable()</methodname> prüft ob das Bucket existiert und
  174. gibt <constant>TRUE</constant> zurück wenn das der Fall ist.
  175. </para>
  176. </listitem>
  177. </itemizedlist>
  178. </sect2>
  179. <sect2 id="zend.service.amazon.s3.objects">
  180. <title>Operationen am Objekt</title>
  181. <para>
  182. Das Objekte ist die grundsätzliche Speichereinheit in S3. Objekte speichern nicht
  183. strukturierte Daten, welche jede Größe, bis zu 4 Gigabyte, haben können. Es gibt kein
  184. Limit in der Anzahl der Objekte die auf dem System gespeichert werden können.
  185. </para>
  186. <para>
  187. Objekte werden in Buckets abgelegt. Sie werden durch den Namen identifiziert, der
  188. jeder UTF-8 String sein kann. Es ist üblich hierarchische Namen zu verwenden (wie z.B.
  189. <code>Pictures/Myself/CodingInPHP.jpg</code> um Objektnamen zu organisieren.
  190. Objektnamen wird der Bucketname vorangestellt wenn Objektfunktionen verwendet werden,
  191. so dass das Objekt "mydata" im Bucket "my-own-bucket" den Namen
  192. <code>my-own-bucket/mydata</code> haben würde.
  193. </para>
  194. <para>
  195. Objekte können ersetzt (durch Überschreiben neuer Daten mit dem gleichen Schlüssel)
  196. oder gelöscht werden, aber nicht geändert, angefügt, usw. Objekte werden immer als
  197. Ganzes gespeichert.
  198. </para>
  199. <para>
  200. Standardmäßig sind alle Objekte privat und es kann nur durch Ihren Besitzer auf Sie
  201. zugegriffen werden. Trotzdem ist es möglich Objekte mit öffentlichem Zugriff zu
  202. spezifizieren, wodurch man auf Sie mit der folgenden <acronym>URL</acronym> zugreifen
  203. kann: <code>http://s3.amazonaws.com/[bucket-name]/[object-name]</code>.
  204. </para>
  205. <itemizedlist>
  206. <listitem>
  207. <para>
  208. <methodname>putObject($object, $data, $meta)</methodname> erstellt ein Objekt
  209. mit dem Namen <varname>$object</varname> (Sollte den Bucketnamen als Präfix
  210. enthalten!) das <varname>$data</varname> als seinen Inhalt besitzt.
  211. </para>
  212. <para>
  213. Der optionale <varname>$meta</varname> Parameter ist das Array von Metadaten,
  214. welches aktuell die folgenden Schlüssel enthalten kann:
  215. </para>
  216. <variablelist>
  217. <varlistentry>
  218. <term><constant>S3_CONTENT_TYPE_HEADER</constant></term>
  219. <listitem>
  220. <para>
  221. <acronym>MIME</acronym> Content Type der Daten. Wenn nicht
  222. angegeben, wird der Typ anhand der Dateiextension des Objektnamens
  223. geschätzt.
  224. </para>
  225. </listitem>
  226. </varlistentry>
  227. <varlistentry>
  228. <term><constant>S3_ACL_HEADER</constant></term>
  229. <listitem>
  230. <para>
  231. Der Zugriff auf das Element. Folgende Zugriffskonstanten können
  232. verwendet werden:
  233. <variablelist>
  234. <varlistentry>
  235. <term><constant>S3_ACL_PRIVATE</constant></term>
  236. <listitem>
  237. <para>
  238. Nur der Besitzer hat auf das Element Zugriff.
  239. </para>
  240. </listitem>
  241. </varlistentry>
  242. <varlistentry>
  243. <term><constant>S3_ACL_PUBLIC_READ</constant></term>
  244. <listitem>
  245. <para>
  246. Jeder kann das Objekt lesen, aber nur der Besitzer
  247. kann schreiben. Diese Eigenschaft kann verwendet
  248. werden um öffentlich zugängliche Inhalte zu
  249. speichern.
  250. </para>
  251. </listitem>
  252. </varlistentry>
  253. <varlistentry>
  254. <term><constant>S3_ACL_PUBLIC_WRITE</constant></term>
  255. <listitem>
  256. <para>
  257. Jeder kann das Objekt schreiben oder lesen. Diese
  258. Eigenschaft sollte sehr spärlich verwendet werden.
  259. </para>
  260. </listitem>
  261. </varlistentry>
  262. <varlistentry>
  263. <term><constant>S3_ACL_AUTH_READ</constant></term>
  264. <listitem>
  265. <para>
  266. Nur der Besitzer hat Schreibzugriff auf das
  267. Element, und andere authentifizierte S3 Benutzer
  268. haben Leserechte. Das ist nützlich um Daten
  269. zwischen S3 Accounts zu teilen ohne Sie der
  270. Öffentlichkeit zugänglich zu machen.
  271. </para>
  272. </listitem>
  273. </varlistentry>
  274. </variablelist>
  275. Standardmäßig sind alle diese Elemente privat.
  276. </para>
  277. <example id="zend.service.amazon.s3.objects.public.example">
  278. <title>
  279. Beispiel für ein öffentliches Objekt in Zend_Service_Amazon_S3
  280. </title>
  281. <programlisting language="php"><![CDATA[
  282. require_once 'Zend/Service/Amazon/S3.php';
  283. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  284. $s3->putObject("my-own-bucket/Pictures/Me.png", file_get_contents("me.png"),
  285. array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
  286. Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
  287. // oder:
  288. $s3->putFile("me.png", "my-own-bucket/Pictures/Me.png",
  289. array(Zend_Service_Amazon_S3::S3_ACL_HEADER =>
  290. Zend_Service_Amazon_S3::S3_ACL_PUBLIC_READ));
  291. echo "Go to http://s3.amazonaws.com/my-own-bucket/Pictures/Me.png to see me!\n";
  292. ]]></programlisting>
  293. </example>
  294. </listitem>
  295. </varlistentry>
  296. </variablelist>
  297. </listitem>
  298. <listitem>
  299. <para>
  300. <methodname>getObject($object)</methodname> empfängt Objektdaten vom Speicher
  301. anhand des Namens.
  302. </para>
  303. </listitem>
  304. <listitem>
  305. <para>
  306. <methodname>removeObject($object)</methodname> entfernt das Objekt vom Speicher.
  307. </para>
  308. </listitem>
  309. <listitem>
  310. <para>
  311. <methodname>getInfo($object)</methodname> empfängt die Metadaten des Objekts.
  312. Diese Funktion gibt ein Array mit Metadaten zurück. Einige der nützlichen
  313. Schlüssel sind:
  314. <variablelist>
  315. <varlistentry>
  316. <term><code>type</code></term>
  317. <listitem>
  318. <para>Der <acronym>MIME</acronym> Typ des Elements.</para>
  319. </listitem>
  320. </varlistentry>
  321. <varlistentry>
  322. <term><code>size</code></term>
  323. <listitem><para>Die Größe der Objektdaten.</para></listitem>
  324. </varlistentry>
  325. <varlistentry>
  326. <term><code>mtime</code></term>
  327. <listitem>
  328. <para>
  329. UNIX-artiger Zeitstempel der letzten Änderung für das Objekt.
  330. </para>
  331. </listitem>
  332. </varlistentry>
  333. <varlistentry>
  334. <term><code>etag</code></term>
  335. <listitem>
  336. <para>
  337. Das ETag der Daten, welches ein MD5 Hash der Daten ist,
  338. eingeklammert von Hochkomma (").
  339. </para>
  340. </listitem>
  341. </varlistentry>
  342. </variablelist>
  343. Die Funktion gibt <constant>FALSE</constant> zurück wenn der Schlüssel keinem
  344. der existierenden Objekte entspricht.
  345. </para>
  346. </listitem>
  347. <listitem>
  348. <para>
  349. <methodname>getObjectsByBucket($bucket)</methodname> gibt eine Liste der
  350. Objektschlüssel zurüc, die im Bucket enthalten sind.
  351. </para>
  352. <example id="zend.service.amazon.s3.objects.list.example">
  353. <title>Beispiel für die Auflistung eines Zend_Service_Amazon_S3 Objekts</title>
  354. <programlisting language="php"><![CDATA[
  355. require_once 'Zend/Service/Amazon/S3.php';
  356. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  357. $list = $s3->getObjectsByBucket("my-own-bucket");
  358. foreach($list as $name) {
  359. echo "Ich habe $name Schlüssel:\n";
  360. $data = $s3->getObject("my-own-bucket/$name");
  361. echo "with data: $data\n";
  362. }
  363. ]]></programlisting>
  364. </example>
  365. </listitem>
  366. <listitem>
  367. <para>
  368. <methodname>isObjectAvailable($object)</methodname> prüft ob das Objekt mit dem
  369. angegebenen Namen existiert.
  370. </para>
  371. </listitem>
  372. <listitem>
  373. <para>
  374. <methodname>putFile($path, $object, $meta)</methodname> fügt den Inhalt der
  375. Datei unter <varname>$path</varname> in das Objekt mit dem Namen
  376. <varname>$object</varname> ein.
  377. </para>
  378. <para>
  379. Das optionale Argument <varname>$meta</varname> ist das gleiche wie für
  380. <code>putObject</code>. Wenn der Content-Typ nicht angegeben wird, wird er
  381. anhand des Dateinamens vermutet.
  382. </para>
  383. </listitem>
  384. </itemizedlist>
  385. </sect2>
  386. <sect2 id="zend.service.amazon.s3.streaming">
  387. <title>Daten Streamen</title>
  388. <para>
  389. Es ist möglich Objekte zu Holen und Setzen wobei keine Stream Daten verwendet werden die
  390. im Speicher sind, sondern Dateien oder <acronym>PHP</acronym> Streams. Das ist Speziell
  391. dann nützlich wenn Dateien sehr groß sind um nicht über Speichergrenzen zu kommen.
  392. </para>
  393. <para>
  394. Um ein Objekt mit Streaming zu Empfangen muss die Methode
  395. <methodname>getObjectStream($object, $filename)</methodname> verwendet werden. Diese
  396. Methode gibt einen <classname>Zend_Http_Response_Stream</classname> zurück, welcher wie
  397. im Kapitel <link linkend="zend.http.client.streaming">HTTP Client Daten Streaming</link>
  398. verwendet werden kann.
  399. <example id="zend.service.amazon.s3.streaming.example1">
  400. <title>Beispiel für das Streamen von Daten mit Zend_Service_Amazon_S3</title>
  401. <programlisting language="php"><![CDATA[
  402. $response = $amazon->getObjectStream("mybycket/zftest");
  403. // Datei kopieren
  404. copy($response->getStreamName(), "my/downloads/file");
  405. // Hinauf Streamen
  406. $fp = fopen("my/downloads/file2", "w");
  407. stream_copy_to_stream($response->getStream(), $fp);
  408. ]]></programlisting>
  409. </example>
  410. </para>
  411. <para>
  412. Der zweite Parameter für <methodname>getObjectStream()</methodname> ist optional und
  413. spezifiziert die Zieldatei in welche die dAten geschrieben werden. Wenn er nicht
  414. spezifiziert ist, wird eine temporäre Datei verwendet. Diese wird gelöscht nachdem das
  415. Antwort-Objekt gelöscht wurde.
  416. </para>
  417. <para>
  418. Um ein Objekt mit Streaming zu Senden kann <methodname>putFileStream()</methodname>
  419. verwendet werden. Es hat die gleiche Signatur wie <methodname>putFile()</methodname>
  420. verwendet aber Streaming und liest die Datei nicht in den Speicher ein.
  421. </para>
  422. <para>
  423. Man kann auch eine Stream Ressource an die <methodname>putObject()</methodname> Methode
  424. als Daten Parameter übergeben. In diesem Fall werden die Daten vom Stream gelesen wenn
  425. die Anfrage an den Server gesendet wird.
  426. </para>
  427. </sect2>
  428. <sect2 id="zend.service.amazon.s3.streams">
  429. <title>Stream wrapper</title>
  430. <para>
  431. Zusätzlich zum oben beschriebenen Interface unterstützt
  432. <classname>Zend_Service_Amazon_S3</classname> das Arbeiten als Stream Wrapper. Hierfür
  433. muß das Client-Objekt als Stream Wrapper registriert werden:
  434. </para>
  435. <example id="zend.service.amazon.s3.streams.example">
  436. <title>Beispiel für Streams mit Zend_Service_Amazon_S3</title>
  437. <programlisting language="php"><![CDATA[
  438. require_once 'Zend/Service/Amazon/S3.php';
  439. $s3 = new Zend_Service_Amazon_S3($my_aws_key, $my_aws_secret_key);
  440. $s3->registerStreamWrapper("s3");
  441. mkdir("s3://my-own-bucket");
  442. file_put_contents("s3://my-own-bucket/testdata", "mydata");
  443. echo file_get_contents("s3://my-own-bucket/testdata");
  444. ]]></programlisting>
  445. </example>
  446. <para>
  447. Die Verzeichnis-Operationen (<code>mkdir</code>, <code>rmdir</code>,
  448. <code>opendir</code>, usw.) werden an Buckets ausgeführt und deshalb sollten deren
  449. Argumente in der Form <code>s3://bucketname</code> angegeben werden. Dateioperationen
  450. werden an Objekten ausgeführt. Objekt Erstellung, Lesen, Schreiben, Löschen, Stat und
  451. Anzeigen von Verzeichnissen wird unterstützt.
  452. </para>
  453. </sect2>
  454. </sect1>