Amazon S3 mit PHP-Stream Wrapper verwenden

In der letzten Woche habe ich ja bereits über die Komponente Zend_Cloud geschrieben und ungetestet behauptet, dass sie sicherlich leicht zu verwenden sei. Das Testen habe ich nun nachgeholt und habe erwartungsgemäß keine bösen Überraschungen erlebt.

Ganz im Gegenteil, sogar! Während meiner Arbeit mit Amazon S3 kam mir der Gedanke, dass es doch sehr bequem wäre, wenn es einen Stream Wrapper gäbe und man die PHP-eigenen File-Funktionen zum Lesen und Schreiben verwenden könnte.

Nach kurzem Suchen habe ich, wen wird es überraschen, eine noch einfachere Lösung gefunden. Zuerst aber mein Versuch mit Zend_Cloud Dateien nach Amazon S3 zu kopieren.

Zend_Cloud

Einfach die Storage-Factory mit den nötigen Zugangsdaten füttern und schon kann es losgehen.

<?php
$adapter      = 'Zend_Cloud_StorageService_Adapter_S3';
$amazonKey    = '<amazon-key>';
$amazonSecret = '<amazon-secret>';
$bucketName   = 'mein-bucket';

$storage = Zend_Cloud_StorageService_Factory::getAdapter(array(
  Zend_Cloud_StorageService_Factory::STORAGE_ADAPTER_KEY => $adapter,
  Zend_Cloud_StorageService_Adapter_S3::AWS_ACCESS_KEY   => $amazonKey,
  Zend_Cloud_StorageService_Adapter_S3::AWS_SECRET_KEY   => $amazonSecret,
  Zend_Cloud_StorageService_Adapter_S3::BUCKET_NAME      => $bucketName,
));

Die Factory liefert uns ein gebrauchsfertiges Objekt zurück, mit dem wir nun Dateien erzeugen können.

<?php
$filename = 'example.txt';
$data = file_get_contents($filename);
$storage->storeItem($filename, $data);

Ebenso einfach wie das Erstellen ist auch das Lesen…

<?php
echo $storage->fetchItem($filename));

…oder Löschen einer Datei.

<?php
$storage->deleteItem($filename);

Zend_Service

Nun hatte ich ja versprochen, dass es noch einfacher geht. Die Komponente Zend_Service bietet ebenfalls eine Schnittstelle für Amazon S3 an und auch gleich eine Methode, diese als Stream Wrapper zu registrieren.

Zuerst muss natürlich das Objekt mit den Zugangsdaten erzeugt werden.

<?php
$amazonKey    = '<amazon-key>';
$amazonSecret = '<amazon-secret>';

$s3 = new Zend_Service_Amazon_S3($amazonKey, $amazonSecret);
$s3->registerStreamWrapper('s3');

Ab jetzt ist der Stream Wrapper mit dem Schema ‘s3://’ im System bekannt und mit den gewohnten File-Funktionen verwendet werden. Dadurch bleibt der Code schlank und man muss sich nicht für jede Speicherart eine andere Schnittstelle merken.

Nicht zuletzt können wir unsere Dateien nun organisieren wie und wo wir wollen ohne dabei wieder den Code umschreiben zu müssen.

<?php
file_put_contents("s3://<bucket-name>/halloWelt", "Hallo Welt"); // einfach schreiben
echo file_get_contents("s3://<bucket-name>/halloWelt"); // und wieder lesen

Nebenbei bemerkt ist es auch recht einfach, sich einen eigenen Stream Wrapper für spezielle Anwendungfälle selber zu schreiben, aber dazu vielleicht mehr in einem weiteren Artikel.

3 Kommentare

  1. In diesem Zusammenhang ist auch die sfFinder-Komponente von Symfony2 sehr interessant: http://fabien.potencier.org/article/44/php-iterators-and-streams-are-awesome

    Im Prinzip kann ein S3 Bucket mit den Features eines Unix “find” Kommandos durchsucht werden.

  2. “Nebenbei bemerkt ist es auch recht einfach, sich einen eigenen Stream Wrapper für spezielle Anwendungfälle selber zu schreiben, aber dazu vielleicht mehr in einem weiteren Artikel.”

    Bitte, auf den artikel freue ich mich besonders! :)

  3. Pingback: Adding Header Support for Zend’s S3 Stream Wrapper | F4H Tech Blog

Schlagwörter: Adapter, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, AutoLoader, Bedienung, Bedingung, Benchmark, Bildbearbeitung, BOM, Bootstrap, Bot, Byte Order Mark, Callback, CamelCase, Canvas, Captcha, Cheatsheet, CLI, Closure, Cloud, CodeSniffer, Community, Comparator, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CSV, CustomLibrary, Custom_Model, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Decorator, Dekorierer, Design Patterns, Dump, Duplikat, each, Eclipse, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Eventhandling, Exception-Handling, Extension, Factory, Fehler, Flash, Foreach, Formatierung, Formular, Funktion, Futon, Header, HTML5, HTTP, IDE, If, Implementierung, InnoDB, Interceptor, Interface, isset, Iterator, Java, JavaScript, jQuery, Konfiguration, Konsole, Kontrollstruktur, kopieren, Late Static Binding, Layout, Linux, Listeners, Logging, Löschen, Magento, Magic Methods, Marketing, Methode, Model, MVC, MySQL, NetBeans, Objekt, Observable, Observer, OOP, Operator, Parameter, Partnersuche, Performance, PHP, phpMyAdmin, PHPUnit, Plugin, Proxy, Qualitätssicherung, Query, Reflection, Request, Response, Rest-API, Rockstar, Routing, S3, Samba, Scheifen, Schleife, Schutz, Secure Shell, Selbstreferenz, Shop, Sicherheit, Sicherung, Singleton Pattern, SOAP, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, SSH, Statement, Stellvertreter, Strategy Pattern, Stream, String, Sun VirtualBox, Support, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Thumbnail, Tool, Tour, Twig, Type-Cast, Umwandlung, Underscore, unset, Vererbung, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Webserver, Webservice, Weiterleitung, Wrapper, Youtube, Zeitsteuerung, Zend Framework, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Service, Zugriffsmethode