Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Amazon S3 S3-Stream-Wrapper mit AWS SDK for PHP Version 3
Der Amazon S3-Stream-Wrapper ermöglicht Ihnen das Speichern und Abrufen von Daten aus Amazon S3 mithilfe integrierter PHP Funktionen wie file_get_contents
fopen
,,copy
,rename
, unlink
mkdir
, undrmdir
.
Sie müssen den Amazon S3 S3-Stream-Wrapper registrieren, um ihn verwenden zu können.
$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();
Auf diese Weise können Sie mithilfe des s3://
Protokolls auf Buckets und Objekte zugreifen, die in Amazon S3 gespeichert sind. Der Amazon S3 S3-Stream-Wrapper akzeptiert Zeichenketten, die einen Bucket-Namen gefolgt von einem Schrägstrich und einem optionalen Objektschlüssel oder Präfix enthalten:. s3://<bucket>[/<key-or-prefix>]
Anmerkung
Der Stream-Wrapper ist auf die Arbeit mit Objekten und Buckets ausgelegt, für die Sie mindestens Leseberechtigung besitzen. Das bedeutet, Ihr Benutzer benötigt die Berechtigung zum Ausführen von ListBucket
für alle Buckets und GetObject
für alle Objekte, mit denen die Benutzer interagieren muss. Für Anwendungsfälle, in denen Sie nicht über diese Berechtigungsstufe verfügen, empfehlen wir, dass Sie Amazon S3 S3-Client-Operationen direkt verwenden.
Daten herunterladen
Sie können den Inhalt eines Objekts mit file_get_contents
abrufen. Seien Sie jedoch vorsichtig mit dieser Funktion; sie lädt den gesamten Inhalt des Objekts in den Speicher.
// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');
Verwenden Sie diese fopen()
Option, wenn Sie mit größeren Dateien arbeiten oder Daten von Amazon S3 streamen müssen.
// Open a stream in read-only mode if ($stream = fopen('s3://bucket/key', 'r')) { // While the stream is still open while (!feof($stream)) { // Read 1,024 bytes from the stream echo fread($stream, 1024); } // Be sure to close the stream resource when you're done with it fclose($stream); }
Anmerkung
Datei-Schreibfehler werden nur dann zurückgegeben, wenn ein Aufruf von fflush
durchgeführt wurde. Diese Fehler werden nicht zurückgegeben, wenn fclose
ohne Leeren aufgerufen wurde. Der Rückgabewert für fclose
ist true
, wenn es den Stream schließt, unabhängig von Fehlern in der Antwort auf seinen internen fflush
. Diese Fehler werden file_put_contents
aufgrund der Art der PHP Implementierung auch nicht beim Aufrufen zurückgegeben.
Öffnet suchbare Streams
Im „r“-Modus geöffnete Streams erlauben nur das Lesen von Daten aus dem Stream und sind standardmäßig nicht durchsuchbar. Auf diese Weise können Daten auf echte Streaming-Weise von Amazon S3 heruntergeladen werden, wobei zuvor gelesene Bytes nicht im Speicher zwischengespeichert werden müssen. Wenn Sie einen Stream brauchen, der durchsuchbar ist, können Sie seekable
in den Stream-Kontext-Optionen
$context = stream_context_create([ 's3' => ['seekable' => true] ]); if ($stream = fopen('s3://bucket/key', 'r', false, $context)) { // Read bytes from the stream fread($stream, 1024); // Seek back to the beginning of the stream fseek($stream, 0); // Read the same bytes that were previously read fread($stream, 1024); fclose($stream); }
Das Öffnen von durchsuchbaren Streams ermöglicht es Ihnen, Bytes zu suchen, die zuvor gelesen wurden. Sie können nicht zu Bytes springen, die noch nicht vom Remote-Server gelesen wurden. Damit zuvor gelesene Daten abgerufen werden können, werden Daten mithilfe eines Stream-Decorators in einem PHP temporären Stream zwischengespeichert. Wenn die Menge der zwischengespeicherten Daten 2 MB überschreitet, werden die Daten im temporären Datenstrom vom Speicher auf die Festplatte übertragen. Denken Sie daran, wenn Sie große Dateien von Amazon S3 mithilfe der seekable
Stream-Kontext-Einstellung herunterladen.
Laden Sie Daten hoch
Sie können Daten mit auf Amazon S3 hochladenfile_put_contents()
.
file_put_contents('s3://bucket/key', 'Hello!');
Größere Dateien können Sie durch Streaming von Daten mit fopen()
und dem Stream-Zugriffsmodus „w“, „x“ oder „a“ streamen. Der Amazon S3 S3-Stream-Wrapper unterstützt keine gleichzeitigen Lese- und Schreibstreams (z. B. „r+“, „w+“ usw.). Das liegt daran, dass das HTTP Protokoll kein gleichzeitiges Lesen und Schreiben zulässt.
$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
Anmerkung
Amazon S3 erfordert die Angabe eines Content-Length-Headers, bevor die Nutzdaten einer Anfrage gesendet werden. Daher werden die bei einem PutObject
Vorgang hochzuladenden Daten intern mithilfe eines PHP temporären Streams gepuffert, bis der Stream geleert oder geschlossen wird.
Anmerkung
Datei-Schreibfehler werden nur dann zurückgegeben, wenn ein Aufruf von fflush
durchgeführt wurde. Diese Fehler werden nicht zurückgegeben, wenn fclose
ohne Leeren aufgerufen wurde. Der Rückgabewert für fclose
ist true
, wenn es den Stream schließt, unabhängig von Fehlern in der Antwort auf seinen internen fflush
. Diese Fehler werden file_put_contents
aufgrund der Art der Implementierung auch nicht beim Aufrufen zurückgegeben. PHP
Fopen-Modi
PHPDie Funktion fopen ()$mode
Option angeben. Die mode-Option legt fest, ob Daten in einen Stream geschrieben oder daraus gelesen werden können und ob die Datei beim Öffnen eines Streams vorhanden sein muss.
Der Amazon S3 S3-Stream-Wrapper unterstützt die folgenden Modi für Streams, die auf Amazon S3 S3-Objekte abzielen.
r |
Ein schreibgeschützter Stream, bei dem das Objekt bereits existieren muss. |
w |
Ein Stream, in den nur geschrieben wird. Wenn das Objekt bereits existiert, wird es überschrieben. |
a |
Ein Stream, in den nur geschrieben wird. Wenn das Objekt bereits existiert, wird es in einen temporären Stream heruntergeladen, und alle Schreibvorgänge in den Stream werden an alle zuvor hochgeladenen Daten angehängt. |
x |
Ein Stream, in den nur geschrieben wird. Ein Fehler wird ausgelöst, wenn das Objekt bereits existiert. |
Andere Objektfunktionen
Stream-Wrapper ermöglichen es vielen verschiedenen integrierten PHP Funktionen, mit einem benutzerdefinierten System wie Amazon S3 zu arbeiten. Hier sind einige der Funktionen, die Sie mit dem Amazon S3-Stream-Wrapper mit in Amazon S3 gespeicherten Objekten ausführen können.
unlink() |
Ein Objekt aus einem Bucket löschen.
Sie können alle verfügbaren Optionen an die Operation
|
filesize() |
Die Größe eines Objekts ermitteln.
|
is_file() |
Prüft, ob a eine Datei URL ist.
|
file_exists() |
Prüft, ob ein Objekt vorhanden ist.
|
filetype() |
Prüft, ob URL a einer Datei oder einem Bucket (dir) zugeordnet ist. |
file() |
Lädt den Inhalt eines Objekts in die Zeilen eines Arrays. Sie können alle verfügbaren Optionen an die Operation |
filemtime() |
Ermittelt das letzte Änderungsdatum eines Objekts. |
rename() |
Benennt ein Objekt um, indem das Objekt kopiert und dann das Original gelöscht wird. Sie können die verfügbaren Optionen für die Operationen |
Anmerkung
Funktioniert zwar copy
im Allgemeinen mit dem Amazon S3 S3-Stream-Wrapper, einige Fehler werden jedoch aufgrund der internen copy
Funktionen in möglicherweise nicht korrekt gemeldet. PHP Wir empfehlen, stattdessen eine Instanz von ObjectCopierAWSS3 zu verwenden.
Arbeiten Sie mit Buckets und Ordnern
Wird verwendetmkdir()
, um mit Buckets zu arbeiten
Sie können Amazon S3 S3-Buckets auf ähnliche Weise erstellen und durchsuchen, wie Sie Verzeichnisse in Ihrem Dateisystem erstellen und durchsuchen PHP können.
Hier ist ein Beispiel, das einen Bucket erstellt.
mkdir('s3://amzn-s3-demo-bucket');
Anmerkung
Im April 2023 aktivierte Amazon S3 Block Public Access automatisch und deaktivierte Zugriffskontrolllisten für alle neu erstellten Buckets. Diese Änderung wirkt sich auch darauf aus, wie die StreamWrapper
mkdir
Funktion mit Berechtigungen und ACLs funktioniert. Weitere Informationen finden Sie in diesem AWS Artikel Was gibt's Neues mit
Sie können Stream-Kontext-Optionen an die mkdir()
Methode übergeben, um mithilfe der für den CreateBucketVorgang verfügbaren Parameter zu ändern, wie der Bucket erstellt wird.
// Create a bucket in the EU (Ireland) Region mkdir('s3://amzn-s3-demo-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));
Mit der rmdir()
-Funktion können Sie Buckets löschen.
// Delete a bucket rmdir('s3://amzn-s3-demo-bucket);
Anmerkung
Ein Bucket kann nur gelöscht werden, wenn er leer ist.
Wird verwendetmkdir()
, um mit Ordnern zu arbeiten
Nachdem Sie einen Bucket erstellt haben, können Sie mkdir()
damit Objekte erstellen, die wie in einem Dateisystem als Ordner fungieren.
Der folgende Codeausschnitt fügt dem vorhandenen Bucket mit dem Namen „amzn-s3-demo-bucket“ ein Ordnerobjekt mit dem Namen „my-folder“ hinzu. Verwenden Sie den Schrägstrich (/
), um den Namen eines Ordnerobjekts vom Bucket-Namen und jedem weiteren Ordnernamen zu trennen.
mkdir('s3://amzn-s3-demo-bucket/my-folder')
Der vorherige Hinweis zu Berechtigungsänderungen nach April 2023 gilt auch für das Erstellen von Ordnerobjekten. Dieser Blogbeitrag
Verwenden Sie die rmdir()
Funktion, um ein leeres Ordnerobjekt zu löschen, wie im folgenden Codeausschnitt gezeigt.
rmdir('s3://amzn-s3-demo-bucket/my-folder')
Listet den Inhalt eines Buckets auf
Sie können die PHP Funktionen opendir (), readdir ()opendir()
$dir = "s3://bucket/"; if (is_dir($dir) && ($dh = opendir($dir))) { while (($file = readdir($dh)) !== false) { echo "filename: {$file} : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); }
Sie können jedes Objekt und jedes Präfix in einem Bucket rekursiv auflisten, indem Sie PHP's RecursiveDirectoryIterator
$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }
Eine andere Möglichkeit, den Inhalt eines Buckets rekursiv aufzulisten, bei dem weniger HTTP Anfragen eingehen, ist die Verwendung der Funktion. Aws\recursive_dir_iterator($path, $context = null)
<?php require 'vendor/autoload.php'; $iter = Aws\recursive_dir_iterator('s3://bucket/key'); foreach ($iter as $filename) { echo $filename . "\n"; }
Optionen für den Stream-Kontext
Sie können den vom Stream-Wrapper verwendeten Client oder den Cache, in dem zuvor geladene Informationen über Buckets und Schlüssel zwischengespeichert werden, anpassen, indem Sie benutzerdefinierte Stream-Kontext-Optionen übergeben.
Der Stream-Wrapper unterstützt die folgenden Stream-Kontext-Optionen für jede Operation.
-
client
-
Das
Aws\AwsClientInterface
-Objekt zum Ausführen von Befehlen. -
cache
-
Eine Instance von
Aws\CacheInterface
für das Caching zuvor ermittelter Dateistatistiken. Standardmäßig verwendet der Stream-Wrapper einen In-Memory-CacheLRU.