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にて指定した期間内の合計日数を出力する方法
PHPにて開始日と終了日をユーザが入力すると、その期間内の合計日数を出力させたい ...
-
-
PHPにて「みんなの自動翻訳」のAPIで日本語から英語に翻訳する方法
翻訳用のWeb APIを利用しようとすると「月に〇〇リクエストまでは無料」とかだ ...
-
-
PHPでメルマガを配信する方法(BCCで一括送信するパターン)
PHPでメールマガジンを配信したかった。宛先のメールアドレスはMySQLに保存さ ...
-
-
PHPにて「みんなの自動翻訳」のAPIで指定したテキストの言語判定する方法
迷惑メール対策等でメール本文が日本語のもののみ受信したい場合がある。ただ、本文内 ...
-
-
PHPにて「ImageHash」ライブラリを使用し画像の類似度を算出する方法
以前にPHPの「image-comparator」ライブラリで画像の類似度を算出 ...