

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

# Amazon S3 stream wrapper nella versione 3 AWS SDK per PHP
<a name="s3-stream-wrapper"></a>

Lo stream wrapper di Amazon S3 consente di archiviare e recuperare dati da Amazon S3 utilizzando funzioni PHP integrate, come`file_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
<a name="downloading-data"></a>

È 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
<a name="opening-seekable-streams"></a>

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](http://www.php.net/manual/en/function.stream-context-create.php) 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
<a name="uploading-data"></a>

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
<a name="fopen-modes"></a>

La funzione [fopen()](http://php.net/manual/en/function.fopen.php) 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
<a name="other-object-functions"></a>

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.<pre>// Delete an object from a bucket<br />unlink('s3://bucket/key');</pre><br />È 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).<pre>// Delete a specific version of an object from a bucket<br />unlink('s3://bucket/key', stream_context_create([<br />    's3' => ['VersionId' => '123']<br />]);</pre> | 
| filesize() | Consente di ottenere le dimensioni di un oggetto.<pre>// Get the Content-Length of an object<br />$size = filesize('s3://bucket/key', );</pre> | 
| is\_file() | Verifica se un URL è un file.<pre>if (is_file('s3://bucket/key')) {<br />    echo 'It is a file!';<br />}</pre> | 
| file\_exists () | Verifica se un oggetto esiste.<pre>if (file_exists('s3://bucket/key')) {<br />    echo 'It exists!';<br />}</pre> | 
| 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](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.ObjectCopier.html)

## Lavora con bucket e cartelle
<a name="working-with-buckets"></a>

### `mkdir()`Da utilizzare per lavorare con i bucket
<a name="work-with-buckets-create"></a>

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://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](https://aws.amazon.com/about-aws/whats-new/2022/12/amazon-s3-automatically-enable-block-public-access-disable-access-control-lists-buckets-april-2023/).

È 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'[CreateBucket](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html#_createBucket)operazione.

```
// 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
<a name="work-with-folders"></a>

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](#work-with-buckets-create) sulle modifiche alle autorizzazioni dopo aprile 2023 entra in gioco anche quando crei oggetti delle cartelle. [Questo post del blog](https://aws.amazon.com/blogs/aws/heads-up-amazon-s3-security-changes-are-coming-in-april-of-2023/) 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://amzn-s3-demo-bucket/my-folder')
```



### Elenca il contenuto di un bucket
<a name="listing-the-contents-of-a-bucket"></a>

Puoi usare le funzioni [PHP [opendir ()](http://www.php.net/manual/en/function.opendir.php), [readdir (), rewinddir ()](http://www.php.net/manual/en/function.readdir.php) e closedir](http://php.net/manual/en/function.closedir.php) [()](http://www.php.net/manual/en/function.rewinddir.php) 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. [ListObjects](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html#_listObjects)`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);
}
```

È possibile elencare in modo ricorsivo ogni oggetto e prefisso in un bucket utilizzando PHP. [RecursiveDirectoryIterator](http://php.net/manual/en/class.recursivedirectoryiterator.php)

```
$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
<a name="id1"></a>

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