翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS SDK for PHP バージョン 3 の Amazon S3 ストリームラッパー
Amazon S3 ストリームラッパーを使用すると、、file_get_contents
、、、、、 などの組み込みPHP関数を使用してmkdir
、Amazon S3 fopen
copy
rename
unlink
からデータを保存および取得できますrmdir
。
使用するために Amazon S3 ストリームラッパーを登録する必要があります。
$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();
これにより、s3://
プロトコルを使用して Amazon S3 に保存されたバケットとオブジェクトにアクセスできます。Amazon S3 ストリームラッパーは、バケット名を含む文字列を受け入れます。この名前にフォワードスラッシュとオプションのオブジェクトキーまたはプレフィックスが続きます (s3://<bucket>[/<key-or-prefix>]
)。
注記
ストリームラッパーは少なくともユーザーの読み取りアクセス許可があるオブジェクトとバケットを操作するために設計されています。つまり、ユーザーが操作する必要がある任意のオブジェクトで ListBucket
、任意のバケットで GetObject
を実行するアクセス許可がユーザーに必要です。このアクセス許可がユーザーにないユースケースでは、Amazon S3 クライアントオペレーションを直接使用することをお勧めします。
データをダウンロードする
file_get_contents
を使用して、オブジェクトのコンテンツを取得できます。ただし、この関数では、オブジェクトのコンテンツ全体をメモリにロードすることに注意してください。
// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');
大きいファイルを操作するとき、または Amazon S3 からデータをストリーミングする必要がある場合は、fopen()
を使用します。
// 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); }
注記
ファイルの書き込みエラーは fflush
の呼び出しが行われた場合にのみ返されます。これらのエラーはフラッシュされていない fclose
が呼び出されたときに返されません。fclose
の戻り値は、ストリームを閉じる場合は true
です。内部 fflush
の応答に何らかエラーがあっても関係ありません。これらのエラーは、 が PHPを実装file_put_contents
しているため、 を呼び出すときにも返されません。
シーク可能なストリームを開く
「r」モードで開いたストリームは、ストリームからデータを読み取ることのみ可能です。さらに、デフォルトではシーク可能ではありません。これは、真にストリーミング方式でデータを Amazon S3 からダウンロードできるようにするためです。ここで、事前読み取りバイトをメモリにバッファする必要はありません。ストリームをシーク可能にする必要がある場合は、seekable
を関数のストリームコンテキストオプション
$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); }
シーク可能なストリームをオープンすると、事前に読み込んだバイト数のシークが可能になります。リモートサーバーからまだ読み取っていないバイト数までスキップすることはできません。以前に読み込んだデータを呼び出すことができるように、データはストリームデコレータを使用してPHP一時ストリームにバッファされます。キャッシュされたデータの量が 2 MB を超えた場合、一時ストリーム内のデータはメモリからディスクに転送されます。seekable
ストリームコンテキスト設定を使用して、Amazon S3 から大きなファイルをダウンロードする際は、このことを念頭に置いてください。
データをアップロードする
file_put_contents()
を使用して Amazon S3 にデータをアップロードすることができます。
file_put_contents('s3://bucket/key', 'Hello!');
fopen()
で「w」、「x」、または「a」ストリームアクセスモードを使用したストリーミングデータによりさらに大きなファイルをアップロードできます。Amazon S3 ストリームラッパーは、同時読み取りおよび書き込みストリーム (「r+」、「w+」など) をサポートしていません。これは、HTTPプロトコルが同時読み取りと書き込みを許可していないためです。
$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
注記
Amazon S3 ではリクエストのペイロードが送信される前に Content-Length ヘッダーを指定する必要があります。したがって、PutObject
オペレーションにアップロードされるデータは、ストリームがフラッシュまたはクローズされるまでPHP、一時ストリームを使用して内部的にバッファされます。
注記
ファイルの書き込みエラーは fflush
の呼び出しが行われた場合にのみ返されます。これらのエラーはフラッシュされていない fclose
が呼び出されたときに返されません。fclose
の戻り値は、ストリームを閉じる場合は true
です。内部 fflush
の応答に何らかエラーがあっても関係ありません。これらのエラーは、 が PHPを実装file_put_contents
しているため、 を呼び出すときにも返されません。
fopen モード
PHPの fopen()$mode
オプションを指定する必要があります。モードオプションでは、データをストリームに対して読み取りや書き込みを行うかどうか、ストリームを開くときに、ファイルが存在しているかどうかを指定します。
Amazon S3 ストリームラッパーは、Amazon S3 オブジェクトをターゲットとするストリームで次のモードをサポートしています。
r |
オブジェクトの存在を前提にしている読み取り専用ストリーム。 |
w |
書き込みのみのストリーム。このオブジェクトが存在している場合、上書きされます。 |
a |
書き込みのみのストリーム。オブジェクトがすでに存在する場合は、一時的なストリームにダウンロードされ、ストリームへの書き込みが事前にアップロードされたデータに追加されます。 |
x |
書き込みのみのストリーム。エラーは、オプションがすでに存在する場合に発生します。 |
その他のオブジェクト関数
ストリームラッパーを使用すると、Amazon S3 などのカスタムシステムを操作するためのさまざまな組み込みPHP関数を使用できます。ここに示すのは、Amazon S3 に格納されるオブジェクトでユーザーが実行することができる Amazon S3 ストリームラッパー関数の一部です。
unlink() |
バケットから 1 つのオブジェクトを削除します。
|
filesize() |
オブジェクトのサイズを取得します。
|
is_file() |
URL が ファイルかどうかを確認します。
|
file_exists() |
オブジェクトが存在するかどうかを確認します。
|
filetype() |
ファイルまたはバケット (dir) にURLマップされているかどうかを確認します。 |
file() |
行の配列にあるオブジェクトの内容をロードします。 |
filemtime() |
オブジェクトが最後に変更された日付を取得します。 |
オブジェクトの名前を() |
オブジェクトをコピーし、元のオブジェクトを削除することで、オブジェクトの名前を変更します。 |
注記
copy
通常、Amazon S3 ストリームラッパーで動作しますが、 copy
の関数の内部が原因で、一部のエラーが適切に報告されない場合がありますPHP。代わりに AwsS3ObjectCopierのインスタンスを使用することをお勧めします。
バケットとフォルダの操作
mkdir()
を使用してバケットを操作する
PHP がファイルシステム上でディレクトリを作成およびトラバースできるようにする方法と同様に、Amazon S3 バケットを作成および参照できます。
以下にバケットの作成の例を挙げます。
mkdir('s3://amzn-s3-demo-bucket');
注記
2023 年 4 月に、Amazon S3 は、すべての新規作成されたバケットについて、S3 ブロックパブリックアクセスを自動的に有効にし、S3 アクセスコントロールリストを無効にするようになりました。この変更は、 StreamWrapper
の mkdir
関数が アクセス許可と でどのように機能するかにも影響しますACLs。詳細については、この記事の最新情報を参照してください AWS
ストリームコンテキストオプションを mkdir()
メソッドに渡すと、 CreateBucket オペレーションで使用できるパラメータを使用してバケットの作成方法を変更することができます。
// Create a bucket in the EU (Ireland) Region mkdir('s3://amzn-s3-demo-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));
rmdir()
関数を使用してバケットを削除できます。
// Delete a bucket rmdir('s3://amzn-s3-demo-bucket);
注記
バケットは、空である場合に限り、削除できます。
mkdir()
を使用してフォルダを操作します。
バケットを作成したら、mkdir()
を使用して、ファイルシステムのフォルダのようにフォルダとして機能するオブジェクトを作成できます。
次のコードスニペットは、「my-folder」という名前のフォルダオブジェクトを「amzn-s3-demo-bucket」という名前の既存のバケットに追加します。フォワードスラッシュ (/
) 文字を使用して、フォルダオブジェクト名をバケット名およびその他のフォルダ名と区切ります。
mkdir('s3://amzn-s3-demo-bucket/my-folder')
2023 年 4 月以降の権限変更に関する前述の注意事項は、フォルダーオブジェクトを作成するときにも関係します。このブログ投稿
次のスニペットに示すように、rmdir()
関数を使用して空のフォルダオブジェクトを削除します。
rmdir('s3://amzn-s3-demo-bucket/my-folder')
バケットの内容を一覧表示する
Amazon S3 ストリームラッパーで opendir()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); }
PHPの を使用して、バケット内の各オブジェクトとプレフィックスを再帰的に一覧表示できますRecursiveDirectoryIterator
$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }
HTTP リクエスト数が少ないバケットの内容を再帰的に一覧表示するもう 1 つの方法は、 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"; }
ストリームコンテキストオプション
ストリームラッパーで使用されるクライアント、またはカスタムストリームコンテキストオプションを渡すことによって、バケットやキーに関する事前にロードされた情報をキャッシュするために使用できるキャッシュをカスタマイズできます。
ストリームラッパーはオペレーションごとに次のストリームコンテキストオプションをサポートしています。
-
client
-
コマンドを実行するために使用する
Aws\AwsClientInterface
オブジェクトです。 -
cache
-
以前に取得したファイル統計情報をキャッシュするために使用する
Aws\CacheInterface
のインスタンスです。デフォルトでは、ストリームラッパーはインメモリLRUキャッシュを使用します。