Pembungkus aliran Amazon S3 dengan Versi 3 AWS SDK for PHP - AWS SDK for PHP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pembungkus aliran Amazon S3 dengan Versi 3 AWS SDK for PHP

Pembungkus aliran Amazon S3 memungkinkan Anda menyimpan dan mengambil data dari Amazon S3 menggunakan PHP fungsi bawaan, seperti,,,,,, file_get_contentsfopen, copy dan. rename unlink mkdir rmdir

Anda perlu mendaftarkan pembungkus aliran Amazon S3 untuk menggunakannya.

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

Ini memungkinkan Anda mengakses bucket dan objek yang disimpan di Amazon S3 menggunakan s3:// protokol. Pembungkus aliran Amazon S3 menerima string yang berisi nama bucket diikuti dengan garis miring ke depan dan kunci objek opsional atau awalan:. s3://<bucket>[/<key-or-prefix>]

catatan

Pembungkus aliran dirancang untuk bekerja dengan objek dan ember di mana Anda setidaknya memiliki izin baca. Ini berarti bahwa pengguna Anda harus memiliki izin untuk mengeksekusi ListBucket pada ember apa pun dan GetObject pada objek apa pun yang perlu berinteraksi dengan pengguna. Untuk kasus penggunaan di mana Anda tidak memiliki tingkat izin ini, sebaiknya Anda menggunakan operasi klien Amazon S3 secara langsung.

Unduh data

Anda dapat mengambil isi objek dengan menggunakanfile_get_contents. Namun, berhati-hatilah dengan fungsi ini; itu memuat seluruh isi objek ke dalam memori.

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

Gunakan fopen() saat bekerja dengan file yang lebih besar atau jika Anda perlu melakukan streaming data dari 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); }
catatan

Kesalahan penulisan file hanya dikembalikan ketika panggilan ke fflush dilakukan. Kesalahan ini tidak dikembalikan ketika unflushed dipanggil. fclose Nilai pengembalian untuk fclose adalah true jika menutup aliran, terlepas dari kesalahan apa pun dalam menanggapi fflush internalnya. Kesalahan ini juga tidak dikembalikan saat menelepon file_put_contents karena cara PHP mengimplementasikannya.

Buka aliran yang dapat dicari

Aliran yang dibuka dalam mode “r” hanya memungkinkan data dibaca dari aliran, dan tidak dapat dicari secara default. Ini agar data dapat diunduh dari Amazon S3 dengan cara yang benar-benar streaming, di mana byte yang dibaca sebelumnya tidak perlu disangga ke dalam memori. Jika Anda membutuhkan aliran agar dapat dicari, Anda dapat meneruskan seekable ke opsi konteks aliran suatu fungsi.

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

Membuka aliran yang dapat dicari memungkinkan Anda mencari byte yang telah dibaca sebelumnya. Anda tidak dapat melewatkan byte yang belum dibaca dari server jarak jauh. Untuk memungkinkan data yang dibaca sebelumnya diingat, data di-buffer dalam aliran PHP suhu menggunakan dekorator aliran. Ketika jumlah data yang di-cache melebihi 2 MB, data dalam aliran temp ditransfer dari memori ke disk. Ingatlah hal ini saat mengunduh file besar dari Amazon S3 menggunakan pengaturan konteks seekable streaming.

Unggah data

Anda dapat mengunggah data ke Amazon S3 menggunakan. file_put_contents()

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

Anda dapat mengunggah file yang lebih besar dengan streaming data menggunakan fopen() dan mode akses aliran “w”, “x”, atau “a”. Pembungkus aliran Amazon S3 tidak mendukung aliran baca dan tulis simultan (misalnya “r+”, “w +”, dll). Ini karena HTTP protokol tidak memungkinkan membaca dan menulis secara simultan.

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

Amazon S3 memerlukan header Content-Length untuk ditentukan sebelum payload permintaan dikirim. Oleh karena itu, data yang akan diunggah dalam suatu PutObject operasi di-buffer secara internal menggunakan aliran PHP suhu hingga aliran disiram atau ditutup.

catatan

Kesalahan penulisan file dikembalikan hanya ketika panggilan ke fflush dilakukan. Kesalahan ini tidak dikembalikan ketika unflushed dipanggil. fclose Nilai pengembalian untuk fclose adalah true jika menutup aliran, terlepas dari kesalahan apa pun dalam menanggapi fflush internalnya. Kesalahan ini juga tidak dikembalikan saat menelepon file_put_contents karena cara PHP mengimplementasikannya.

mode fopen

PHPfungsi fopen () mengharuskan Anda menentukan $mode opsi. Opsi mode menentukan apakah data dapat dibaca atau ditulis ke aliran, dan apakah file harus ada saat membuka aliran.

Pembungkus aliran Amazon S3 mendukung mode berikut untuk aliran yang menargetkan objek Amazon S3.

r

Aliran read-only di mana objek harus sudah ada.

w

Aliran tulis saja. Jika objek sudah ada, itu ditimpa.

a

Aliran tulis saja. Jika objek sudah ada, itu diunduh ke aliran sementara dan penulisan apa pun ke aliran ditambahkan ke data yang diunggah sebelumnya.

x

Aliran tulis saja. Kesalahan muncul jika objek sudah ada.

Fungsi objek lainnya

Pembungkus aliran memungkinkan banyak PHP fungsi bawaan yang berbeda untuk bekerja dengan sistem khusus seperti Amazon S3. Berikut adalah beberapa fungsi yang memungkinkan pembungkus aliran Amazon S3 Anda lakukan dengan objek yang disimpan di Amazon S3.

memutuskan tautan ()

Hapus objek dari ember.

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

Anda dapat meneruskan opsi apa pun yang tersedia untuk DeleteObject operasi untuk mengubah cara objek dihapus (misalnya menentukan versi objek tertentu).

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

ukuran file ()

Dapatkan ukuran objek.

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

adalah_file ()

Memeriksa apakah a URL adalah file.

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

file_exists ()

Memeriksa apakah ada objek.

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

tipe file ()

Memeriksa apakah URL peta ke file atau bucket (dir).

berkas ()

Muat isi objek dalam array baris. Anda dapat meneruskan opsi apa pun yang tersedia untuk GetObject operasi untuk memodifikasi cara file diunduh.

filemtime ()

Dapatkan tanggal modifikasi terakhir dari suatu objek.

ganti nama ()

Ganti nama objek dengan menyalin objek kemudian menghapus aslinya. Anda dapat meneruskan opsi yang tersedia untuk CopyObject dan DeleteObject operasi ke parameter konteks aliran untuk mengubah cara objek disalin dan dihapus.

catatan

Meskipun copy umumnya berfungsi dengan pembungkus aliran Amazon S3, beberapa kesalahan mungkin tidak dilaporkan dengan benar karena internal fungsi di. copy PHP Kami menyarankan Anda menggunakan instance AWSS3 ObjectCopier sebagai gantinya.

Bekerja dengan ember dan folder

Gunakan mkdir() untuk bekerja dengan ember

Anda dapat membuat dan menelusuri bucket Amazon S3 mirip dengan cara PHP memungkinkan Anda membuat dan melintasi direktori pada sistem file Anda.

Berikut adalah contoh yang membuat ember.

mkdir('s3://amzn-s3-demo-bucket');
catatan

Pada bulan April 2023, Amazon S3 secara otomatis mengaktifkan S3 Block Public Access dan menonaktifkan daftar kontrol akses untuk semua bucket yang baru dibuat. Perubahan ini juga memengaruhi cara kerja mkdir fungsi dengan izin danACLs. StreamWrapper Informasi lebih lanjut tersedia di AWS artikel Apa yang Baru dengan ini.

Anda dapat meneruskan opsi konteks aliran ke mkdir() metode untuk mengubah cara bucket dibuat menggunakan parameter yang tersedia untuk CreateBucketoperasi.

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

Anda dapat menghapus ember menggunakan rmdir() fungsi.

// Delete a bucket rmdir('s3://amzn-s3-demo-bucket);
catatan

Ember hanya dapat dihapus jika kosong.

Gunakan mkdir() untuk bekerja dengan folder

Setelah Anda membuat bucket, Anda dapat menggunakan mkdir() untuk membuat objek yang berfungsi sebagai folder seperti dalam sistem file.

Cuplikan kode berikut menambahkan objek folder bernama 'my-folder' ke bucket yang ada bernama 'amzn-s3-demo-bucket'. Gunakan karakter forward slash (/) untuk memisahkan nama objek folder dari nama bucket dan nama folder tambahan apa pun.

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

Catatan sebelumnya tentang perubahan izin setelah April 2023 juga ikut bermain saat Anda membuat objek folder. Posting blog ini memiliki informasi tentang cara menyesuaikan izin jika diperlukan.

Gunakan rmdir() fungsi untuk menghapus objek folder kosong seperti yang ditunjukkan pada cuplikan berikut.

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

Buat daftar isi ember

Anda dapat menggunakan fungsi opendir (), readdir (), rewinddir (), dan closedir () PHP dengan pembungkus aliran Amazon S3 untuk melintasi isi bucket. Anda dapat meneruskan parameter yang tersedia untuk ListObjectsoperasi sebagai opsi konteks aliran kustom ke opendir() fungsi untuk memodifikasi bagaimana objek terdaftar.

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

Anda dapat secara rekursif mencantumkan setiap objek dan awalan dalam ember menggunakan PHP's. RecursiveDirectoryIterator

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

Cara lain untuk membuat daftar konten bucket secara rekursif yang menimbulkan lebih sedikit HTTP permintaan adalah dengan menggunakan fungsi tersebut. 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"; }

Opsi konteks streaming

Anda dapat menyesuaikan klien yang digunakan oleh pembungkus aliran, atau cache yang digunakan untuk menyimpan informasi yang dimuat sebelumnya tentang bucket dan kunci, dengan meneruskan opsi konteks aliran kustom.

Pembungkus aliran mendukung opsi konteks aliran berikut pada setiap operasi.

client

Aws\AwsClientInterfaceObjek yang digunakan untuk menjalankan perintah.

cache

Contoh Aws\CacheInterface untuk digunakan untuk cache statistik file yang diperoleh sebelumnya. Secara default, pembungkus aliran menggunakan cache dalam memoriLRU.