ひよっこPGのブログ

主に、技術メモや英語たまにギター関連のことも書いているブログです。

PHPからフォルダ構成ごとzip圧縮

phpでフォルダ構成ごとzip圧縮しないといけない用件がありまして、それで色々調べた結果をメモしておきます。

ZipArchiveクラスを使う方法(自分的には非推奨)

前提 : PHP5.2以上
http://www.php.net/manual/ja/class.ziparchive.php

でもこのZipArchiveクラスで圧縮する場合、フォルダごと圧縮ということは出来ないみたいです。

圧縮するファイル追加ならあるんですが、圧縮するフォルダ追加とかがないんですよね・・・。

なので無理やりするとしたら
addFile(圧縮対象のファイルパス, [ファイル名]) 圧縮するファイルを追加
addEmptyDir(ディレクトリ名) 圧縮ファイルに新しいディレクトリを作成

フォルダ構成を調べて addEmptyDirでディレクトリを作成後→addFileでそのディレクトリに追加という処理が必要になります。

<?php
  // ZIPファイルのフォルダ構成
  // |-test.txt
  // |-test.jpg
  // |-test2
  //     |-test2.txt

$zip = new ZipArchive();

if ($zip->open('archive.zip', ZipArchive::CREATE) === true) {
  $zip->addFile('test.txt');
  $zip->addFile('test.jpg');
  $zip->addEmptyDir("test2");
  $zip->addFile('test2.txt','test2/test2.txt');
  $zip->close();
} else {
  exit('open error.');
}
?>

上記の処理はめんどう・・・・と思って他の方法を探したところ

phpLinuxコマンドを実行して zip圧縮! という方法がありました。

PHPLinuxコマンドを使う方法

この方法だと、フォルダごと圧縮 が出来るので一発です。
下記は自分が作った簡単なサンプルソースです。

<?php

// zipファイル名
$fileName = "zipFile";
// 圧縮対象フォルダ
$compressDir = "/var/www/html/ZipTest/test/";
// zipファイル保存先
$zipFileSavePath = "/var/www/html/ZipTest/";

// コマンド
// cd:ディレクトリの移動
// zip:zipファイルの作成
$command =  "cd ". $compressDir .";".
	    "zip -r ". $zipFileSavePath . $fileName .".zip .";

// Linuxコマンドの実行
exec($command);

// 圧縮したファイルをダウンロードさせる。
header('Pragma: public');
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$fileName.".zip");
readfile("/var/www/html/ZipTest/".$fileName.".zip");

?>

まとめ

ZipArchiveクラスで圧縮 フォルダごと圧縮出来ない
Linuxコマンドで圧縮 フォルダごと圧縮出来る!