下記のようなエラーが発生しました。
① Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): Unable to find the wrapper
② Fatal error: Uncaught RuntimeException: Cannot rewind file
なんぞこれ…って感じでしたが、対処法は公式ドキュメントに載ってましたね、有難い…。
AWSはドキュメントがしっかりしてて好きです。
公式ドキュメント
① の 対処法ですが、ドキュメントの上の方にあるように
Amazon S3 ストリームラッパーにより、組み込み PHP 関数 file_get_contents、fopen、copy、rename、unlink、mkdir、rmdir などを使用して Amazon S3 に対してデータの保存および取得ができます。使用するために Amazon S3 ストリームラッパーを登録する必要があります。
AWS SDK for PHPバージョン 3 の Amazon S3 ストリームラッパー
とあります。
なので、 $s3Client に対してこちらを追加します。
$s3Client->registerStreamWrapper();
①は出なくなりました。
そしてファイル操作をしようとすると②のエラーが出ました。
こちらも同じページ書いてありました。有難い…。
「r」モードで開いたストリームは、ストリームからデータを読み取ることのみ可能です。さらに、デフォルトではシーク可能ではありません。これは、真にストリーミング方式でデータを Amazon S3 からダウンロードできるようにするためです。ここで、事前読み取りバイトをメモリにバッファする必要はありません。ストリームをシーク可能にする必要がある場合は、seekable を関数のストリームコンテキストオプションに渡すことができます。
シーク可能なストリームを開く
公式の通りにやってみましょう。
公式は fopen() 関数を例にしてサンプルを置いてくれていますが、SplFileObjectも同様です。
$context = stream_context_create(array(
's3' => array(
'seekable' => true
)
));
$file = new SplFileObject($s3_path, 'r', false, $context);
他にもこの辺の関数も同様に使えるので file_exists() なんかを使って存在チェックなどもした方が良いかと思います。