Flysystemは複数のファイルシステムを透過的に操作できるライブラリです。
ローカルのファイルシステム(UNIX系/Windows)はもとより、zip形式のファイル書庫やFTPやWebDAVを経由したリモートディスク、Amazon S3やDropBoxのようなクラウドサービスなど、さまざまです。
公式サイト | Flysystem - Multiple Filesystems, One API |
概要 | Abstraction for local and remote filesystems |
パッケージ名 | league/flysystem |
作者 | The League of Extraordinary Packages |
ライセンス | MIT License |
バージョン | v1.0.15 (2015-09-30) |
インストール
Composerでインストール可能です。
composer.phar require league/flysystem
また、READMEにはComposerに依存しないインストール方法についても言及があります。
API
どのようなファイルシステムに対しても、以下のようなメソッド呼び出しで利用することができます。
以下は基本的なメソッドを抜萃したもので、すべてのメソッドは公式ドキュメントのAPI - Flysystemを参照してください。
<?php // ファイルの存在確認 $exists = $filesystem->has('path/to/file.txt'); // ファイルを読み込む $contents = $filesystem->read('path/to/file.txt'); // ファイルを読み込むストリームを得る $stream = $filesystem->readStream('something/is/here.ext'); // ファイルに書き込む $filesystem->write('path/to/file.txt', 'contents'); // ファイルに追記する $filesystem->put('path/to/file.txt', 'contents'); // ファイルを削除する $filesystem->delete('path/to/file.txt'); // ファイルを読み込んで削除する $contents = $filesystem->readAndDelete('path/to/file.txt'); // ファイルをリネーム(移動)する $filesystem->rename('filename.txt', 'newname.txt');
重要なのはストリームのまま処理できることですかね。数十MB程度ならともかく、数GB以上の巨大なファイルを利用する場合にその全てをメモリに載せてファイルに書き込むのは明らかに非効率なので、stream_copy_to_stream($fs->readStream($f), fopen($target, 'w'));
のようなイディオムで記述すれば効率よく処理できる、気がする。
Adapter
Flysytemは「Adapter」と呼ばれる機構で、さまざまなファイルシステム/プロトコルに対応します。
本稿執筆時点でドキュメントに記載のある対応ファイルシステムは以下の通りです。
Local Azure AWS S3 V2 AWS S3 V3 Copy.com Dropbox FTP GridFS Memory Null / Test Rackspace ReplicateAdapter SFTP WebDAV PHPCR ZipArchive
なほ、Local/Null/FTP以外は別途インストールが必要になります。
Integrations
Flysystemと各フレームワークをつなぎこむためのインターフェイスも、それぞれ別ライブラリとして提供されてゐます。
たとへばGrahamCampbell/Laravel-Flysystemを利用すると、Laravelのファサードとして利用することができます。