Amazon S3 stream wrapper で S3 操作時の注意点
S3を触っていて、これは便利と思った機能。「s3」というプロトコルが使えるようになり、ローカルのファイル操作と同じように、S3上のファイルを触れるようになります。
触って、ちょとだけはまったのが次のポイント。
※2013/08/13に修正・追記
S3のフォルダは is_dir() で判定できないis_dir()で判定できない時ががある
S3バケット中で作れるフォルダは、「フォルダライクなファイル」。その為か、is_dir() でS3のフォルダパス渡しても false が返りました返るケースがありました。
- ManagementConsoleでS3バケット上にフォルダを作る → is_dir() にはfalseが返る
- StreamWrapperで作ったフォルダとか、EMR実行の結果作成されたフォルダ → is_dir() にはtrueが返る
いくつかローカルファイルを扱うコードを試して、ここだけ違いがありました。(ただし、バケットそのものは、 is_dir() で判定可能です)
なお作り方によって、ディレクトリ内をreaddir()した結果に違いがありました。このあたりが、結果に反映されてるのかな?
- ManagementConsoleでS3バケット上にフォルダ → . ファイルが存在する
- StreamWrapperで作ったフォルダ → . ファイルは存在しない
公式のドキュメントは見つけれらなかったのですが、次のエントリから「/で終わるファイル」をフォルダとして表記しているだけという理解。そのため、上記の反応は、S3の構造上、正しいといえると思います。
S3 stream wrapperの理解
S3 stream wrapperの使い方
S3クライアントから、次のメソッドを呼び出すと使えます。
- registerStreamWrapper()
- Amazon S3 stream wrappe
なお、SDK for PHP の v1でもv2でもサポートされてるようです。(v1では未検証ですが、サンプルコードのポストを目にしました)
stream wrapperって?
もともと、PHPにStreamWrapperという機能があり、その s3:// 版なんですね。
S3 stream wrapperを使う利点
なるほど、テストなどが統一的にかける様になる。なっとくです。テスト時は vfsStream を使って「vfs://」か。