LoginSignup
14
17

More than 5 years have passed since last update.

PHPでzip/rar/pdfでアーカイブされたマンガを扱う

Posted at

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());

こちらもアーカイブ内の特定のファイルを引っ張ってくるの高速でできるので解凍せずに扱える。

pdf

つらい
IMagick(Image Magick)とか使えば連番画像にできるのでアップロード時とかに変換処理を走らせておくといいと思う。
それか大抵のブラウザはPDFを適切に処理してくれるのでそれに任せてしまうとか。
IMagickを使うと一応ページ単位で画像に変換したりできるんですが、内部でghostscriptが叩かれたりして超重い(ファイルによっては30秒とか)ので現実的でない。というか内部的にはページ単位じゃなくて全部変換してる気がする。
自力でPDFまともに扱うのはつらみしかない。

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17