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 PHP funzioni 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
. Inoltre, questi errori non vengono restituiti durante la chiamata a file_put_contents
causa del modo in cui lo PHP implementa.
Apri flussi 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
$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 il richiamo dei dati letti in precedenza, i dati vengono memorizzati nel buffer 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 HTTP protocollo 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, i dati da caricare in un'PutObject
operazione vengono bufferizzati internamente utilizzando un flusso PHP temporaneo fino a quando lo stream 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
. Inoltre, questi errori non vengono restituiti durante la chiamata a file_put_contents
causa del modo in cui lo implementa. PHP
modalità fopen
PHPla funzione fopen ()$mode
opzione. 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 PHP funzioni 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.
È possibile trasferire qualsiasi opzione disponibile all'operazione
|
filesize() |
Consente di ottenere le dimensioni di un oggetto.
|
is_file() |
Verifica se a è un fileURL.
|
file_exists () |
Verifica se un oggetto esiste.
|
filetype() |
Controlla se un è URL mappato a un file o a un bucket (dir). |
file() |
Carica i contenuti di un oggetto in una serie di righe. È possibile trasferire qualsiasi opzione disponibile all'operazione |
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 |
Nota
Sebbene copy
in genere funzioni con lo stream wrapper di Amazon S3, alcuni errori potrebbero non essere segnalati correttamente a causa delle funzioni interne della funzione in. copy
PHP 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 analogo a come ti PHP consente di creare e attraversare le directory sul tuo file system.
Ecco un esempio che crea un bucket.
mkdir('s3://amzn-s3-demo-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 con StreamWrapper
le autorizzazioni e. ACLs Ulteriori informazioni sono disponibili in questo AWS articolo Cosa c'è di nuovo con
È 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://amzn-s3-demo-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));
È possibile eliminare bucket utilizzando la funzione rmdir()
.
// Delete a bucket rmdir('s3://amzn-s3-demo-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 'amzn-s3-demo-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://amzn-s3-demo-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
Utilizzate la rmdir()
funzione per eliminare un oggetto cartella vuoto, come illustrato nel seguente frammento.
rmdir('s3://amzn-s3-demo-bucket/my-folder')
Elenca il contenuto di un bucket
Puoi usare le PHP funzioni 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); }
Puoi elencare in modo ricorsivo ogni oggetto e prefisso in un bucket usando's. 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 il contenuto di un bucket in modo ricorsivo che comporta un minor numero di richieste consiste nell'utilizzare la funzione. HTTP 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, lo stream wrapper utilizza una cache in LRU memoria.