翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon S3 ストリームラッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパー AWS SDK for PHP
Amazon S3 ストリームラッパーにより、組み込み PHP 関数 file_get_contents
、fopen
、copy
、rename
、unlink
、mkdir
、rmdir
などを使用して Amazon S3 に対してデータの保存および取得ができます。
使用するために 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
の応答に何らかエラーがあっても関係ありません。これらのエラーは file_put_contents
呼び出し時にも返されません。これは PHP 実装の仕様のためです。
シーク可能なストリームを開く
「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
の応答に何らかエラーがあっても関係ありません。これらのエラーは file_put_contents
呼び出し時にも返されません。これは PHP 実装の仕様のためです。
オープンモード
PHP の fopen()$mode
オプションを指定する必要があります。モードオプションでは、データをストリームに対して読み取りや書き込みを行うかどうか、ストリームを開くときに、ファイルが存在しているかどうかを指定します。
Amazon S3 ストリームラッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパーッパー
r |
オブジェクトが既に存在している必要がある読み取り専用ストリーム。 |
w |
書き込みのみのストリーム。そのオブジェクトがすでに存在する場合、上書きされます。 |
a |
書き込みのみのストリーム。オブジェクトが既に存在する場合、オブジェクトは一時ストリームにダウンロードされ、ストリームへの書き込みは以前にアップロードされたデータに追加されます。 |
x |
書き込みのみのストリーム。オブジェクトが既に存在する場合、エラーが発生します。 |
そのほかのオブジェクト関数
ストリームラッパーにより、さまざまな組み込み PHP 関数は Amazon S3 などのカスタムシステムで使用できます。ここに示すのは、Amazon S3 に格納されるオブジェクトでユーザーが実行することができる Amazon S3 ストリームラッパー関数の一部です。
unlink() |
バケットから 1 つのオブジェクトを削除します。
|
filesize() |
オブジェクトのサイズを取得します。
|
is_file() |
URL がファイルかどうかを確認します。
|
file_exists() |
オブジェクトが存在するかどうかを確認します。
|
filetype() |
URL がファイルまたはバケット (dir) にマッピングされるかどうかを確認します。 |
file() |
行の配列にあるオブジェクトの内容をロードします。 |
filemtime() |
オブジェクトが最後に変更された日付を取得します。 |
オブジェクトの名前を() |
オブジェクトをコピーし、元のオブジェクトを削除することで、オブジェクトの名前を変更します。 |
注記
通常、copy
は Amazon S3 ストリームラッパーとともに使用できますが、PHP での copy
関数の内部処理のために一部のエラーが適切に報告されないことがあります。代わりに、AWS3 ObjectCopier のインスタンスを使用することをお勧めします。
バケットの使用
Amazon S3 バケットを変更して参照できます。使用するファイルシステムのディレクトリの変更とトラバーサルを PHP で許可する方法と同様です。
以下にバケットの作成の例を挙げます。
mkdir('s3://bucket');
mkdir()
メソッドにストリームコンテキストオプションを渡して、CreateBucketオペレーションで使用できるパラメータを使用してバケットの作成方法を変更できます。
// Create a bucket in the EU (Ireland) Region
mkdir('s3://bucket', stream_context_create([
's3' => ['LocationConstraint' => 'eu-west-1']
]);
rmdir()
関数を使用してバケットを削除できます。
// Delete a bucket
rmdir('s3://bucket');
注記
バケットは、空である場合に限り、削除できます。
バケットの内容の一覧表示
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 リクエストで再帰的に、バケットの内容をリストする別の方法は、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 キャッシュを使用します。