Stream wrapper Amazon S3 con versione 3 AWS SDK for PHP - AWS SDK for PHP

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Stream wrapper Amazon S3 con versione 3 AWS SDK for PHP

Lo stream wrapper di Amazon S3 consente di archiviare e recuperare dati da Amazon S3 utilizzando funzioni PHP integrate, comefile_get_contents,,,,, e. fopen copy rename unlink mkdir rmdir

È necessario registrare lo stream wrapper Amazon S3 per utilizzarlo.

$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();

Ciò consente di accedere a bucket e oggetti archiviati in Amazon S3 utilizzando s3:// il protocollo. Lo stream wrapper di Amazon S3 accetta stringhe che contengono un nome di bucket seguito da una barra e una chiave oggetto o un prefisso opzionale:. s3://<bucket>[/<key-or-prefix>]

Nota

Il wrapper di flusso è progettato per l'utilizzo con oggetti e bucket su cui si dispone almeno delle autorizzazioni di lettura. Pertanto, il tuo utente dovrebbe disporre delle autorizzazioni necessarie per eseguire ListBucket sui bucket e GetObject sugli oggetti con cui deve interagire. Per i casi d'uso in cui non disponi di questo livello di autorizzazione, ti consigliamo di utilizzare direttamente le operazioni del client Amazon S3.

Scarica i dati

È possibile acquisire i contenuti di un oggetto utilizzando file_get_contents. Tuttavia, questa funzione deve essere utilizzata con cautela, in quanto carica nella memoria tutti i contenuti dell'oggetto.

// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');

fopen()Utilizzalo quando lavori con file di grandi dimensioni o se devi eseguire lo streaming di dati da Amazon S3.

// 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); }
Nota

Gli errori di scrittura file vengono restituiti solo quando si chiama la funzione fflush . Questi errori non vengono restituiti quando si chiama una funzione fclose senza svuotamento. Il valore restituito per fclose sarà true se chiude il flusso, indipendentemente da eventuali errori riportati in risposta alla funzione interna fflush. Questi errori non vengono restituiti nemmeno quando si chiama file_put_contents per via del modo in cui PHP implementa questa funzione.

Apri stream ricercabili

I flussi aperti in modalità "r" consentono la lettura dei dati solo dal flusso e non supportano la ricerca per impostazione predefinita. In questo modo i dati possono essere scaricati da Amazon S3 in un vero e proprio streaming, in modo che i byte letti in precedenza non debbano essere inseriti nel buffer in memoria. Se è necessario che un flusso supporti la ricerca, è possibile trasferire seekable nelle opzioni del contesto del flusso di una funzione.

$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); }

L'apertura di flussi che supportano la ricerca consente di cercare byte letti in precedenza. Non è possibile passare a byte che non sono stati ancora letti dal server remoto. Per consentire ai dati letti in precedenza di essere richiamati, viene eseguito il buffering dei dati in un flusso PHP temporaneo utilizzando un decoratore di flussi. Quando la quantità di dati memorizzati nella cache supera i 2 MB, i dati nel flusso temporaneo vengono trasferiti dalla memoria al disco. Tienilo a mente quando scarichi file di grandi dimensioni da Amazon S3 utilizzando l'impostazione del contesto dello seekable stream.

Carica dati

Puoi caricare dati su Amazon S3 utilizzando. file_put_contents()

file_put_contents('s3://bucket/key', 'Hello!');

È possibile caricare file di dimensioni maggiori tramite streaming dei dati utilizzando fopen() e una modalità di accesso ai flussi "w", "x" o "a". Lo stream wrapper di Amazon S3 non supporta flussi di lettura e scrittura simultanei (ad esempio «r+», «w+», ecc.). Questo perché il protocollo HTTP non consente la lettura e la scrittura simultanee.

$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
Nota

Amazon S3 richiede che venga specificata un'intestazione Content-Length prima dell'invio del payload di una richiesta. Pertanto, viene eseguito internamente il buffering dei dati da caricare in un'operazione PutObject utilizzando un flusso PHP temporaneo fino a quando il flusso non viene svuotato o chiuso.

Nota

Gli errori di scrittura file vengono restituiti solo quando si chiama la funzione fflush . Questi errori non vengono restituiti quando si chiama una funzione fclose senza svuotamento. Il valore restituito per fclose sarà true se chiude il flusso, indipendentemente da eventuali errori riportati in risposta alla funzione interna fflush. Questi errori non vengono restituiti nemmeno quando si chiama file_put_contents per via del modo in cui PHP implementa questa funzione.

modalità fopen

La funzione fopen() di PHP richiede che venga specificata un'opzione $mode. L'opzione della modalità specifica se i dati possono essere letti o scritti in un flusso e se il file deve esistere durante l'apertura di un flusso.

Lo stream wrapper di Amazon S3 supporta le seguenti modalità per gli stream destinati a oggetti Amazon S3.

r

Un flusso di sola lettura in cui l'oggetto deve già esistere.

w

Un flusso di sola scrittura. Se l'oggetto esiste già, viene sovrascritto.

a

Un flusso di sola scrittura. Se l'oggetto esiste già, viene scaricato in uno stream temporaneo e le eventuali scritture sullo stream vengono aggiunte ai dati caricati in precedenza.

x

Un flusso di sola scrittura. Se l'oggetto esiste già, viene generato un errore.

Altre funzioni dell'oggetto

Gli stream wrapper consentono a diverse funzioni PHP integrate di funzionare con un sistema personalizzato come Amazon S3. Ecco alcune delle funzioni che lo stream wrapper di Amazon S3 ti consente di eseguire con oggetti archiviati in Amazon S3.

unlink()

Consente di eliminare un oggetto da un bucket.

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

È possibile trasferire qualsiasi opzione disponibile all'operazione DeleteObject per modificare il modo in cui l'oggetto viene eliminato (ad esempio, specificando una versione dell'oggetto specifica).

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

filesize()

Consente di ottenere le dimensioni di un oggetto.

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

is_file()

Verifica se un URL è un file.

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

file_exists ()

Verifica se un oggetto esiste.

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

filetype()

Verifica se un URL è associato a un file o a un bucket (directory).

file()

Carica i contenuti di un oggetto in una serie di righe. È possibile trasferire qualsiasi opzione disponibile all'operazione GetObject per modificare il modo in cui il file viene scaricato.

filemtime()

Consente di ottenere la data dell'ultima modifica di un oggetto.

rename()

Consente di rinominare un oggetto copiandolo ed eliminando l'oggetto di origine. È possibile trasferire opzioni disponibili per le operazioni CopyObject e DeleteObject ai parametri del contesto del flusso per modificare il modo in cui l'oggetto viene copiato ed eliminato.

Nota

Sebbene copy in genere funzioni con lo stream wrapper di Amazon S3, alcuni errori potrebbero non essere segnalati correttamente a causa delle caratteristiche interne della funzione in PHP. copy Ti consigliamo invece di utilizzare un'istanza di AwSS3. ObjectCopier

Lavora con bucket e cartelle

mkdir()Da utilizzare per lavorare con i bucket

Puoi creare e sfogliare i bucket Amazon S3 in modo simile a come PHP ti consente di creare e attraversare le directory sul tuo file system.

Ecco un esempio che crea un bucket.

mkdir('s3://my-bucket');
Nota

Nell'aprile 2023, Amazon S3 ha abilitato automaticamente S3 Block Public Access e disabilitato gli elenchi di controllo degli accessi per tutti i bucket appena creati. Questa modifica influisce anche sul funzionamento della mkdir funzione StreamWrapper's con le autorizzazioni e gli ACL. Ulteriori informazioni sono disponibili in questo articolo Cosa c'è di nuovo con AWS.

È possibile passare le opzioni di contesto dello stream al mkdir() metodo per modificare il modo in cui il bucket viene creato utilizzando i parametri disponibili per l'CreateBucketoperazione.

// Create a bucket in the EU (Ireland) Region mkdir('s3://my-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));

È possibile eliminare bucket utilizzando la funzione rmdir().

// Delete a bucket rmdir('s3://my-bucket);
Nota

Un bucket può essere eliminato solo se è vuoto.

Utilizzatelo mkdir() per lavorare con le cartelle

Dopo aver creato un bucket, è possibile mkdir() utilizzarlo per creare oggetti che funzionano come cartelle come in un file system.

Il seguente frammento di codice aggiunge un oggetto cartella denominato «my-folder» al bucket esistente denominato «my-bucket». Utilizzate il carattere forward slash (/) per separare il nome di un oggetto cartella dal nome del bucket e da qualsiasi nome di cartella aggiuntivo.

mkdir('s3://my-bucket/my-folder')

La nota precedente sulle modifiche alle autorizzazioni dopo aprile 2023 entra in gioco anche quando crei oggetti delle cartelle. Questo post del blog contiene informazioni su come modificare le autorizzazioni, se necessario.

Utilizzate la rmdir() funzione per eliminare un oggetto cartella vuoto, come illustrato nel seguente frammento.

rmdir('s3://my-bucket/my-folder')

Elenca il contenuto di un bucket

Puoi usare le funzioni PHP opendir (), readdir (), rewinddir () e closedir () con lo stream wrapper Amazon S3 per attraversare il contenuto di un bucket. È possibile passare i parametri disponibili all'operazione come opzioni di contesto di flusso personalizzate alla funzione per modificare la modalità di elenco degli oggetti. ListObjectsopendir()

$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); }

È possibile elencare in modo ricorsivo ogni oggetto e prefisso in un bucket utilizzando PHP. RecursiveDirectoryIterator

$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }

Un altro modo per elencare i contenuti di un bucket in modo ricorsivo ma con un numero inferiore di richieste HTTP è utilizzare la funzione 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"; }

Opzioni di contesto di streaming

È possibile personalizzare il client utilizzato dal wrapper di flusso o la cache utilizzata per memorizzare nella cache informazioni sui bucket e sulle chiavi caricate in precedenza trasferendo le opzioni personalizzate relative al contesto del flusso.

Il wrapper di flusso supporta le seguenti opzioni relative al contesto del flusso per ogni operazione.

client

L'oggetto Aws\AwsClientInterface da utilizzare per eseguire i comandi.

cache

Un'istanza di Aws\CacheInterface da utilizzare per memorizzare nella cache le statistiche dei file ottenute in precedenza. Per impostazione predefinita, il wrapper di flusso utilizza una cache LRU nella memoria.