As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Wrapper de stream do Amazon S3 com o AWS SDK for PHP versão 3
O stream wrapper do Amazon S3 permite armazenar e recuperar dados do Amazon S3; usando funções embutidas do PHP, como file_get_contents
, fopen
, copy
, rename
, unlink
, mkdir
e rmdir
.
Você precisa registrar o stream wrapper do Amazon S3 para usá-lo.
$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();
Deste modo, é possível acessar buckets e objetos armazenados no Amazon S3 por meio do protocolo s3://
. O stream wrapper do Amazon S3 aceita sequências que contêm um nome do bucket seguido por uma barra e uma chave de objeto ou prefixo opcional: s3://<bucket>[/<key-or-prefix>]
.
nota
O stream wrapper é projetado para trabalhar com objetos e buckets nos quais você tenha pelo menos permissão de leitura. Isso significa que o usuário deve ter permissão para executar ListBucket
em qualquer bucket, e GetObject
em qualquer objeto com o qual o usuário precisa interagir. Para casos de uso em que você não tenha esse nível de permissão, recomendamos usar as operações de cliente do Amazon S3 diretamente.
Download de dados
Você pode capturar o conteúdo de um objeto usando file_get_contents
. No entanto, tenha cuidado com essa função; ela carrega todo o conteúdo do objeto na memória.
// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');
Use fopen()
ao trabalhar com arquivos maiores ou se precisar fazer fluxos de dados do 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
Os erros de gravação de arquivos só são retornados quando uma chamada fflush
é feita. Esses erros não são retornados quando um fclose
não liberado é chamado. O valor de retorno de fclose
será true
se ele fechar o stream, independentemente de qualquer erro em resposta ao fflush
interno. Esses erros também não são retornados ao chamar file_put_contents
devido ao modo como o PHP o implementa.
Abra fluxos pesquisáveis
Os streams abertos no modo "r" só permitem que os dados sejam lidos no stream e não são pesquisáveis por padrão. Isso é para que o download dos dados possa ser feito no Amazon S3 na forma de streaming verdadeiro, onde os bytes lidos anteriormente não precisam ser armazenados em buffer na memória. Se você precisar que um stream seja pesquisável, você pode passar seekable
para as opções do contexto de stream
$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); }
A abertura de streams pesquisáveis permite que você busque bytes que tenham sido lidos anteriormente. Você não pode pular para bytes que ainda não tenham sido lidos no servidor remoto. Para permitir que os dados lidos anteriormente sejam lembrados, os dados são armazenados em buffer em um stream temporário do PHP usando um decorador de stream. Quando a quantidade de dados em cache excede 2 MB, os dados no stream temporário são transferidos da memória para o disco. Lembre-se disso ao fazer download de arquivos grandes do Amazon S3 usando a configuração de contexto de stream seekable
.
Carregar dados
Você pode fazer upload dos dados para o Amazon S3 usando file_put_contents()
.
file_put_contents('s3://bucket/key', 'Hello!');
Você pode fazer upload de arquivos maiores por dados de streaming usando fopen()
e um modo de acesso de stream "w", "x" ou "a". O stream wrapper do Amazon S3 não é compatível com streams de leitura e gravação simultâneas (por exemplo, "r+", "w+", etc.). Isso ocorre porque o protocolo HTTP não permite leitura e gravação simultâneas.
$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
nota
O Amazon S3 exige que um cabeçalho Content-Length seja especificado antes que a carga de uma solicitação seja enviada. Portanto, os dados a serem carregados em uma operação PutObject
são armazenados em buffer internamente usando um stream temporário do PHP até que o stream seja liberado ou fechado.
nota
Os erros de gravação são retornados apenas quando é feita uma chamada para fflush
. Esses erros não são retornados quando um fclose
não liberado é chamado. O valor de retorno de fclose
será true
se ele fechar o stream, independentemente de qualquer erro em resposta ao fflush
interno. Esses erros também não são retornados ao chamar file_put_contents
devido ao modo como o PHP o implementa.
Modos fopen
A função fopen()$mode
. O opção do modo especifica se os dados podem ser lidos ou gravados em um stream, e se o arquivo deve existir ao abrir um stream.
O wrapper de stream do Amazon S3 suporta os seguintes modos para streams que têm como alvo objetos do Amazon S3.
r |
Um stream somente leitura onde o objeto já deve existir. |
w |
Um stream somente gravação. Se o objeto já existir, ele será substituído. |
a |
Um stream somente gravação. Se o objeto já existir, ele será obtido por download para um stream temporário e todas as gravações no stream serão acrescentadas a qualquer dado carregado anteriormente. |
x |
Um stream somente gravação. Será gerado um erro se o objeto já existir. |
Outras funções de objetos
Os wrappers de stream permitem muitas funções diferentes do PHP embutidas para trabalhar com um sistema personalizado, como o Amazon S3. Estas são algumas das funções que o stream wrapper do Amazon S3 permite que você execute com objetos armazenados no Amazon S3.
unlink() |
Excluir um objeto de um bucket.
Você pode passar todas as opções disponíveis para a operação
|
filesize() |
Obter o tamanho de um objeto.
|
is_file() |
Verifica se uma URL é um arquivo.
|
file_exists() |
Verifica se um objeto existe.
|
filetype() |
Verifica se uma URL é mapeada para um arquivo ou bucket (dir). |
file() |
Carrega o conteúdo de um objeto em uma matriz de linhas. Você pode passar todas as opções disponíveis para a operação |
filemtime() |
Obtém a data da última modificação de um objeto. |
rename() |
Renomeia um objeto copiando-o e excluindo o original. Você pode passar as opções disponíveis para as operações |
nota
Embora copy
normalmente funcione com o stream wrapper do Amazon S3, alguns erros podem não ser relatados corretamente devido às partes internas da função copy
no PHP. Em vez disso, recomendamos que você use uma instância de AwsS3ObjectCopier.
Trabalhe com buckets e pastas
Use mkdir()
para trabalhar com buckets
Você pode criar e navegar pelos buckets do Amazon S3 da mesma forma que o PHP permite criar e percorrer diretórios no seu sistema de arquivos.
Aqui está um exemplo que cria um bucket.
mkdir('s3://my-bucket');
nota
Em abril de 2023, o Amazon S3 automaticamente habilita o Bloqueio de Acesso Público do S3 e desabilita as listas de controle de acesso para todos os novos buckets criados. Essa alteração também afeta a forma como a mkdir
função de StreamWrapper
funciona com permissões e ACLs. Mais informações estão disponíveis no artigo O que há de novo na AWS
É possível transmitir as opções de contexto de stream para o método mkdir()
a fim de modificar a maneira como o bucket é criado usando os parâmetros disponíveis para a operação CreateBucket.
// Create a bucket in the EU (Ireland) Region mkdir('s3://my-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));
Você pode excluir buckets usando a função rmdir()
.
// Delete a bucket rmdir('s3://my-bucket);
nota
Um bucket só pode ser excluído se estiver vazio.
Use mkdir()
para trabalhar com pastas
Depois de criar um bucket, você pode usar mkdir()
para criar objetos que funcionam como pastas como em um sistema de arquivos.
O trecho de código a seguir adiciona um objeto de pasta chamado 'my-folder' ao bucket existente chamado 'my-bucket'. Use o caractere de barra (/
) para separar um nome de objeto de pasta do nome do bucket e de qualquer nome de pasta adicional.
mkdir('s3://my-bucket/my-folder')
A observação anterior sobre alterações de permissão após abril de 2023 também entra em ação quando você cria objetos de pasta. Esta postagem do blog
Use a função rmdir()
para excluir um objeto de pasta vazio, como mostrado no snippet a seguir.
rmdir('s3://my-bucket/my-folder')
Listar o conteúdo de qualquer bucket
Você pode usar as funções opendir()opendir()
para modificar a maneira como os objetos são listados.
$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); }
Você pode listar cada objeto e prefixo recursivamente em um bucket usando RecursiveDirectoryIterator
$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }
Outra forma de listar o conteúdo de um bucket recursivamente que incorre em um número menor de solicitações HTTP é usando a função 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"; }
Opções de contexto de stream
Você pode personalizar o cliente usado pelo stream wrapper ou o cache usado para armazenar em cache as informações carregadas anteriormente sobre buckets e chaves, passando as opções de contexto de stream personalizado.
O stream wrapper é compatível com as seguintes opções de contexto de stream em cada operação.
-
client
-
O objeto
Aws\AwsClientInterface
a ser usado para executar comandos. -
cache
-
Uma instância de
Aws\CacheInterface
a ser usada para armazenar em cache as estatísticas de arquivos obtidas anteriormente. Por padrão, o stream wrapper usa um cache LRU na memória.