comic viewer的なものを作っているとこういうのを扱う必要がでてくる。Webベースだと画像単位でリクエスト分けたかったりするのでそういう時にどうするかという話
zip
大抵PHPに最初からついてくるZipArchiveというライブラリが使える。
$zip = new \ZipArchive;
if (!$zip->open($path)) {
throw new \Exception("error");
}
// アーカイブされているファイル全部をなんかする
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
$body = $zip->getFromIndex($index);
// do something
}
// i番目のファイルの中身を返す
return $zip->getFromIndex($index);
画像1枚のリクエストごとにzipファイルをopenして、指定されたのファイルのjpgを返すみたいなことをしても結構高速に動いてくれる。解答してディレクトリに展開せず扱えるのは非常に便利
rar
RarArchiveがZipArchiveと同じ感じで使える。細かいインターフェースは色々違うのでそこら辺はラッパー書いたほうが良い
インストール
pecl install rar
# ...../php.iniとかに以下を追加
extension = rar.so
PHP5.5 + Ubuntu13.10だと上記でうまくいった。OS X Marvericksだとなぜかコケたので手動makeしてインストールしたらいけた。
$rar = \RarArchive::open($path);
if ($rar === false) {
throw new \Exception("error");
}
// アーカイブされているファイル全部をなんかする
$entries = $this->rar->getEntries();
foreach ($entries as $entry) {
// do something
}
// i番目のファイルの中身を返す
$entries = $this->rar->getEntries();
$entry = $entries[$index];
$stream = $entry->getStream();
return fread($stream, $entry->getUnpackedSize());
こちらもアーカイブ内の特定のファイルを引っ張ってくるの高速でできるので解凍せずに扱える。
つらい
IMagick(Image Magick)とか使えば連番画像にできるのでアップロード時とかに変換処理を走らせておくといいと思う。
それか大抵のブラウザはPDFを適切に処理してくれるのでそれに任せてしまうとか。
IMagickを使うと一応ページ単位で画像に変換したりできるんですが、内部でghostscriptが叩かれたりして超重い(ファイルによっては30秒とか)ので現実的でない。というか内部的にはページ単位じゃなくて全部変換してる気がする。
自力でPDFまともに扱うのはつらみしかない。