PHPにて画像ファイルをZIP形式にまとめてダウンロードする機会がありました。
PHPに存在するZipArchiveはとっても便利なんだけど容量の壁が存在します。
(32bitのライブラリを使用している以上 仕方ないですね)
ではどうすれば2GBを超えるZIP形式の圧縮ファイルを作れるのか?
色々調べてみたところtar形式からzip形式に変換するのが妥当な様子でした。
従来はZipArchiveを直接扱っていたので
$zip = new ZipArchive(); $zip->open("ZIP圧縮ファイル名", ZIPARCHIVE::CREATE); $zip->addFile("圧縮対象の実パス", "圧縮後のZIP内パス"); ... $zip->close();
このような流れでしたが、
大容量ZIPを作成するにはPharData(中身はtarコンテナですね)からZIPに変換を行います。
$path = "一時圧縮ファイル名"; $pd= new PharData($path); $pd->addFile("圧縮対象の実パス", "圧縮後のZIP内パス"); ... $zip = $pd->convertToData(Phar::ZIP); // zipコンテナ化 unlink($path); // 一時圧縮ファイルを削除 $path = $zip->getPath(); // 圧縮後のファイルパス
あとはファイルダウンロードの手順と同じになります。