5
1

More than 3 years have passed since last update.

LaravelでZipファイルに圧縮する実装をしてみた(Laravel6.0以降の対応)

Posted at

やりたいこと

結論からいうと、Laravelのstorage/logsディレクトリ配下のlogファイルをzip形式に圧縮するよって話です。

業務で関わっているサービスでstorage/logsディレクトリ以下をS3に保存する処理があるのですが、如何せんlogファイルのサイズが大きくS3のボリュームがすぐにいっぱいになってしまいます。

そこで、s3に保存するファイルをzip形式に圧縮しようとなり、その時に実装を備忘録として残します。

*今回、あくまでzipファイルを作成するまでの処理で、s3に保存する処理は省略しています。

zipファイル作成にはZipArchiveを使えば楽

かつてはchumper/zipperをcomposerでインストールすれば簡単にzipファイルを作成できたらしいのですが、どうやらLaravel6.0以降ではchumper/zipperが使用できなくっていました。

ですので、Laravel6.0以降ではZipArchiveを使いましょう!

以下のように書きました。
(開発の終わりでリファクタリングする予定ですが、取り急ぎのコードだということを御了承ください)

        // 任意のファイル名を決める
        $logPath = storage_path('zip/log' . '.zip');
        // zipArchive発動
        $zip = new ZipArchive();
        $zip->open($logPath, ZipArchive::CREATE);

        for($i = 1 ; $i <=3  ; $i++) {
          // storage/logsディレクトリ以下のファイルを追加
          $zip->addFile('storage/logs/data/data-'. $i . '.log');
          $zip->addFile('storage/logs/debug/debug-'. $i . '.log');
          $zip->addFile('storage/logs/error/error-'. $i . '.log');
        }
        $zip->close()

これでstorage/logsディレクトリ以下にzipディレクトリが作成されて、logsファイルが圧縮された形で保管されているはずです。

追加で

例えば、3日前のlogだけを取得したい場合などはCarbonで指定してあげればいいですね。
僕は実務で以下のように書きました。

$subDay = Carbon::now()->subDay(3)->toDateString();

     for($i = $subDay ; $i <=$subDay  ; $i++) {
          // storage/logsディレクトリ以下のファイルを追加
          $zip->addFile('storage/logs/data/data-'. $i . '.log');
          $zip->addFile('storage/logs/debug/debug-'. $i . '.log');
          $zip->addFile('storage/logs/error/error-'. $i . '.log');
       }  

簡単ですが、以上になります。

参考サイト

【Laravel】zip、gzip、bz2で圧縮してダウンロードする方法
いつもお世話になっているサイトです。ありがとうございます。

5
1
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
5
1