File_Archive の使用例のひとつとして考えられるのは、 ギャラリーの画像や動画のファイルから動的にアーカイブを生成することです。
効率的に生成することを考えるなら、どのファイルフォーマットを選択するかが大事です。 選択肢をあげてみましょう。
利点: 効率よく作成できてメモリの使用量が一定、キャッシュは不要
欠点: 圧縮ができない (とはいえ、もともと画像や動画はそれ以上に圧縮するのは困難です)、 また Zip ほど広く知れ渡っていない
利点: 圧縮率が高く、メモリの使用量が一定
欠点: キャッシュができない。また、生成時に CPU にかなりの負荷がかかる
利点: 中間結果をキャッシュすることができる。 圧縮レベルを指定することができる。 幅広く用いられている。
欠点: 圧縮率が Tgz/Tbz より低い
ここでは Tar と Zip を取り上げます。Tgz や Tbz は、 アーカイブを "その場で" 作成するには CPU を食いすぎます。
<?php
require_once "File/Archive.php";
// $files は、アーカイブに追加するファイルへのパスの配列です
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.tar',
File_Archive::toOutput()
)
);
?>
Zip を使用する最大の利点は、リソースをあまり消費しないこと (結果をキャッシュできるので) と幅広く用いられている形式であることです。 とりうる方法は二通りあります。まずは未圧縮の Zip アーカイブを作成すること (画像ファイルや動画ファイルは、もともとそれ以上の圧縮を期待できないため)、 もうひとつはキャッシュシステムを利用して圧縮済みの Zip アーカイブを作成することです。
その場での未圧縮 ZIP アーカイブの作成
<?php
require_once "File/Archive.php";
File_Archive::setOption('zipCompressionLevel', 0);
// $files は、アーカイブに追加するファイルへのパスの配列です
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.zip',
File_Archive::toOutput()
)
);
?>
その場での圧縮 ZIP アーカイブの作成 (キャッシュを使用)
<?php
require_once "File/Archive.php";
require_once "Cache/Lite.php";
// $options 配列の意味については Cache_Lite のドキュメントを参照ください
// fileNameProtection はデフォルトの true のままでなければなりません
// automaticSerialization は不要なので false のままでなければなりません
$options = array('cacheDir' => 'tmp');
File_Archive::setOption('cache', new Cache_Lite($options));
File_Archive::setOption('zipCompressionLevel', 9);
// $files は、アーカイブに追加するファイルへのパスの配列です
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.zip',
File_Archive::toOutput()
)
);
?>
zip の作成と tar の作成はほとんど同じコードとなるので、 ユーザの選択内容に応じて処理を切り替えるコードをすっきりと書くことができます。 次のコードは、実際に私のサイトで使用しているものです。
カスタムアーカイブ
<?php
$allowedFormats = array('tar', 'zip');
if (!in_array($_GET['type'], $allowedFormats)) {
die('Type ' . htmlspecialchars($_GET['type']) . ' is either unknown or not allowed');
}
require_once "File/Archive.php";
File_Archive::setOption('zipCompressionLevel', 0);
/**
* I skipped the generation of the $files array since it really
* depends on you gallery and what files the user requires
*/
File_Archive::extract(
$files,
File_Archive::toArchive(
'myGallery.' . $_GET['type'],
File_Archive::toOutput()
)
);
?>