超PHPerになろう

Enjoy PHP Programming

さまざまな環境で統一的にファイルを操作する [league/flysystem]

Flysystemは複数ファイルシステムを透過的に操作できるライブラリです。

ローカルのファイルシステム(UNIX系/Windows)はもとより、zip形式のファイル書庫やFTPWebDAVを経由したリモートディスク、Amazon S3DropBoxのようなクラウドサービスなど、さまざまです。

公式サイト 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のファサードとして利用することができます。