ギャラリーのファイルからの動的なアーカイブ生成
Prev Next

ギャラリーのファイルからの動的なアーカイブ生成

ギャラリーのファイルからの動的なアーカイブ生成 – File_Archive で画像や動画を処理する方法

File_Archive の使用例のひとつとして考えられるのは、 ギャラリーの画像や動画のファイルから動的にアーカイブを生成することです。

効率的に生成することを考えるなら、どのファイルフォーマットを選択するかが大事です。 選択肢をあげてみましょう。

  1. Tar
  2. Tgz, Tbz
  3. Zip
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 アーカイブを作成することです。

その場での未圧縮 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()
    )
);
?>

Prev File_Archive Next
例 PEAR Manual リーダー