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_contents
fopen
, 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
$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 ()$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.
Anda dapat meneruskan opsi apa pun yang tersedia untuk
|
ukuran file () |
Dapatkan ukuran objek.
|
adalah_file () |
Memeriksa apakah a URL adalah file.
|
file_exists () |
Memeriksa apakah ada objek.
|
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 |
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 |
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
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 ()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\AwsClientInterface
Objek 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.