ギャラリーのファイルからの動的なアーカイブ生成
ギャラリーのファイルからの動的なアーカイブ生成 – File_Archive で画像や動画を処理する方法
File_Archive の使用例のひとつとして考えられるのは、
ギャラリーの画像や動画のファイルから動的にアーカイブを生成することです。
効率的に生成することを考えるなら、どのファイルフォーマットを選択するかが大事です。
選択肢をあげてみましょう。
- Tar
-
利点:
効率よく作成できてメモリの使用量が一定、キャッシュは不要
-
欠点:
圧縮ができない (とはいえ、もともと画像や動画はそれ以上に圧縮するのは困難です)、
また Zip ほど広く知れ渡っていない
- Tgz, Tbz
-
利点:
圧縮率が高く、メモリの使用量が一定
-
欠点:
キャッシュができない。また、生成時に CPU にかなりの負荷がかかる
- Zip
-
利点:
中間結果をキャッシュすることができる。
圧縮レベルを指定することができる。
幅広く用いられている。
-
欠点:
圧縮率が Tgz/Tbz より低い
ここでは Tar と Zip を取り上げます。Tgz や Tbz は、
アーカイブを "その場で" 作成するには CPU を食いすぎます。
Tar の作成
<?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()
)
);
?>