PHP関数でAWS S3ファイルの書き込み・読み込み

PHPAWS

AWS SDK for PHP Ver 3 では、 Amazon S3 ストリームラッパーというのを使うと fopencopy 、 file_get_contents といった PHP の関数を使って、 S3 のファイルにアクセスすることができる。
ストリームラッパーを使って S3 にあるファイルへの読み込み、書き込みの方法をメモ。

ストリームラッパーを登録

S3Client オブジェクトに、ストリームラッパーを登録すると s3:// というプロトコルを使って S3 オブジェクトにアクセス可能となる。

require 'PATH/vendor/autoload.php';
use Aws\S3\S3Client;
 
$s3Client = new S3Client([
    'version' => 'latest',
    'region'  => 'REGION-NAME'
]);
// ストリームラッパー登録
$s3Client->registerStreamWrapper();

ファイルの読み込み (ダウンロード)

'key' という表記は、「フォルダ名 + ファイル名」のこと。

fopen + fread

fopen()fread() を使った方法。

$stream = fopen($file, 'r');
if (FALSE === $stream) {
    exit("Failed to open.");
}

while (!feof($stream)) {
    // 1,024 bytes づつ読み込み
    echo fread($stream, 1024);
}
// ファイルを閉じる
fclose($stream);

file_get_contents

file_get_contents() を使った方法。

この関数は、ファイルの中身を全部読みこむので、ファイルサイズが大きいときは使わない。
小さなファイルのときのみ。

$txt = file_get_contents('s3://bucket/key');
header('Content-Type: text/plain');
header('Content-Length: ' . count($txt));
header('Content-Disposition: attachment; filename=hoge.txt');
echo $txt;

ファイルの書き込み(アップロード)

file_put_contents

fopen() ( S3 とかどっかから) 取って来たデータを、 file_put_contents() を使って S3 (またはどっか) にアップロードする。

// 読み込み
$file = fopen('s3://bucket001/key', 'r');
// 書き込み
file_put_contents('s3://bucket002/key', $file);

ファイルがなければ新規作成、ファイルが存在していれば上書きされる。

copy

どこかから取って来たデータをそのまま書き込む場合はコピーしちゃう。
ファイルがなければ新規作成、同名ファイルが存在していれば上書きされる。

bucket001 から bucket002 にコピー

copy('s3://bucket001/key', 's3://bucket002/key');

fopen + fwrite

fopen()fwrite() を使った方法。サイズの大きなファイルをアップロードできる。

// 追記モードでファイルを開く
$stream = fopen('s3://bucket002/key', 'a');
// 「HogeHoge」を追記
fwrite($stream, 'HogeHoge');
fclose($stream);

ファイルを追記モードで開くなどは下記の項を参照。

fopen のモードについて

fopen のモード

fopen() は第二引数に、 $mode パラメータを指定する。

Amazon S3 ストリームラッパーでサポートされている mode パラメータ

モード説明
r読み取り専用。
w書き込み専用。ファイルが存在している場合、上書き、存在しない場合、新規作成。
a書き込み専用。ファイルが存在している場合、追記、存在しない場合、新規作成。
x書き込み専用。ファイルが存在している場合 *1、エラー。

[注意] 公式ガイドの説明に間違いがある

本家のガイド AWS SDK for PHP – fopen モード には以下のように書いてあるが、ファイルが存在するとエラーになる。 PHP の仕様通りの動き。

Amazon S3 Stream Wrapper with AWS SDK for PHP Version 3 fopen Modes guide
Amazon S3 Stream Wrapper with AWS SDK for PHP Version 3 fopen Modes

PHP の仕様

モード 'x’ ファイルポインタをファイルの先頭に置きます。 ファイルが既に存在する場合には fopen() は失敗し、 E_WARNING レベルのエラーを発行します。 ファイルが存在しない場合には新規作成を試みます。

PHP マニュアル fopen
実際、ファイルがすでに存在するのに、 x モードで fopen したときのエラー s3://bucket001/key already exists on Amazon S3


Posted by Agopeanuts