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(); // 圧縮後のファイルパス
あとはファイルダウンロードの手順と同じになります。