Amazon S3 S3-Stream-Wrapper mit AWS SDK for PHP Version 3 - AWS SDK for PHP

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_contentsfopen,,copy,rename, unlinkmkdir, 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 einer Funktion übergeben.

$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 () erfordert, dass Sie eine $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.

// Delete an object from a bucket unlink('s3://bucket/key');

Sie können alle verfügbaren Optionen an die Operation DeleteObject übergeben, um zu ändern, wie das Objekt gelöscht wird (z. B. Angabe einer bestimmten Objektversion).

// Delete a specific version of an object from a bucket unlink('s3://bucket/key', stream_context_create([ 's3' => ['VersionId' => '123'] ]);

filesize()

Die Größe eines Objekts ermitteln.

// Get the Content-Length of an object $size = filesize('s3://bucket/key', );

is_file()

Prüft, ob a eine Datei URL ist.

if (is_file('s3://bucket/key')) { echo 'It is a file!'; }

file_exists()

Prüft, ob ein Objekt vorhanden ist.

if (file_exists('s3://bucket/key')) { echo 'It exists!'; }

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 GetObject übergeben, um zu ändern, wie das Objekt heruntergeladen wird.

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 CopyObject und DeleteObject an die Stream-Kontextparameter übergeben, um zu ändern, wie das Objekt kopiert und gelöscht wird.

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 enthält Informationen darüber, wie Sie Berechtigungen bei Bedarf anpassen können.

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 (), rewinddir () und closedir () mit dem Amazon S3 S3-Stream-Wrapper verwenden, um den Inhalt eines Buckets zu durchsuchen. Sie können Parameter, die für den ListObjectsVorgang verfügbar sind, als benutzerdefinierte Stream-Kontextoptionen an die Funktion übergeben, um die Art und Weise zu ändern, wie Objekte aufgelistet werden. 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 RecursiveDirectoryIteratorverwenden.

$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.