PHPで複数のファイルをまとめてzipファイル化し、ダウンロードさせる方法
2024/01/13
PHPで複数のファイルをまとめてzipファイル化し、ユーザーにダウンロードさせたい。また、それとは別に特定のディレクトリを丸ごとzipファイル化し、こちらもダウンロードさせたい。以下に2つの対応方法をメモ。
複数のファイルをzipファイル化
//zip圧縮したいファイル一覧
$file_list = array(
'./index.html',
'./test.css',
'./test.js',
'./test.jpg',
);
//zipインスタンス作成
$zip_obj = new zipArchive($file_list);
//一時ファイル名前とパス
$zip_name = date('Ymdhis') . '.zip';
$zip_path = '/public_html/' . $zip_name;
//一時ファイルを作成
$result = $zip_obj->open($zip_path, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
if( $result !== true ){
echo 'error';
exit;
}
//zipにファイルを追加
foreach ($file_list as $file) {
$file_name = basename($file);
$zip_obj->addFromString($file_name, file_get_contents($file));
}
$zip_obj->close();
//ダウンロードさせる
header('Content-Type: application/zip; name="' . $zip_name . '"');
header('Content-Disposition: attachment; filename="' . $zip_name . '"');
header('Content-Length: '.filesize($zip_path));
echo file_get_contents($zip_path);
// 一時ファイル(zipファイル)の削除
unlink($zip_path);
exit();
ダウンロードさせる前の時点までの処理でメモリ消費量を測定したところ、ファイルの合計サイズとほぼ同等のメモリを消費していた。テストした際はファイル合計サイズが20MBでメモリ消費量もほぼ同等だった。
画像や動画ファイルをこの方法でzipファイル化する場合、メモリ消費量がひどいことになりそう。その際はphp.iniのmemory_limitの値に注意する。
特定ディレクトリを丸ごとzipファイル化
//zip化したいディレクトリ
$target_path = '/public_html/zip_dir';
//zipファイル名
$zip_name = 'zip_dir.zip';
//zipファイルの一時保存場所
$zip_path = '/public_html/' . $zip_name;
//zipファイル作成
chdir($target_path);
exec("zip -r {$zip_path} .");
//ダウンロードさせる
header('Content-Type: application/zip; name="' . $zip_name . '"');
header('Content-Disposition: attachment; filename="' . $zip_name . '"');
header('Content-Length: '.filesize($zip_path));
echo file_get_contents($zip_path);
//zipファイルを削除
unlink($zip_path);
exit();
こちらもメモリ消費量を計測したところ、ファイルの合計サイズは20MBに対してメモリ消費量は1KB未満だった。また、参考サイトによると処理速度もこちらの方法の方が速いみたい。
所感
メモリ消費量や処理速度を見た限りでは基本的にディレクトリ丸ごとzipファイル化するのが良さそう。ただ、レンタルサーバ等でsystem関数やexec関数が使用できないケースもあるので、そのような場合は前述の方法で対応する。
参考サイト
関連記事
-
-
PHPページングテンプレ
使いやすいのがあったのでメモ。 $page ...
-
-
CodeIgniter4 & reCAPTCHA でお問い合わせフォームを作成する方法
以前CodeIgniter4.4.4で簡易的なお問い合わせページを作成したが、今 ...
-
-
PHPで画像のフォーマット(拡張子)の変換
画像のアップロードでjpg/png/gif形式を受け付けつつ、 最終的にjpgで ...
-
-
PHPでJavaScriptを圧縮するライブラリ「JShrink」の利用方法
サイト内でJavaScriptを用いる場合、外部のライブラリやプラグインだと圧縮 ...
-
-
Stripeでキャンセル処理を行う際に「$config must be a string ~」エラーが出る場合の対応方法
Stripeにて先日メモした内容でキャンセル(返金)処理をしようとしたところ1件 ...