zip圧縮を行う方法。

準備するまでが少々面倒ですが、その後は比較的楽かも(・∀・)


このサイトの「PHP 5.2.10 zip package」というのをダウンロード。
ダウンロードファイルの中に「ext」というフォルダがあり、その中に「php_zip.dll」が入っています。
これを、PHPインストールフォルダの下の「ext」に移動します。


その後「php.ini」に以下の記述を加えます。

[PHP_ZIP]
extension=php_zip.dll

これで準備OK!!


zip圧縮を行うメソッドの例が以下。

  • set_time_limit関数を使って、処理時間を延長しています。
  • unlink関数を使って、ファイル削除を行っています。

private function makeZipFile($outputFileName){
  set_time_limit(3000);
  // ログ記録インスタンスの生成
  $logging = new Logging();
  $logging->loggingStartZip($outputFileName);
  // 出力先ファイルのディレクトリに移動
  chdir($this->masterRootDir.self::OUTPUT_FILE_DIR);
  $zip = new ZipArchive;
  $zipFileName = str_replace(".txt", "", $outputFileName);
  $zipFileName = $zipFileName.".zip";
  $zipFilePath = $this->masterRootDir.self::OUTPUT_FILE_DIR.$zipFileName;
  $res = $zip->open($zipFile, ZipArchive::CREATE);
  if ($res === TRUE) {
      $zip->addFile(basename($outputFileName));
      $zip->close();
   // 元のファイルを削除
   unlink($outputFileName);
   $logging->loggingEndZip($outputFileName);
  }
  // ルートディレクトリに戻る
  chdir($this->masterRootDir); 
  return $zipFilePath;
}


このメソッドをループで数回呼び出して、複数のテキストファイルを圧縮する
という使い方をしていました。
当初、

  1. テキストファイルの置いてあるディレクトリに移動。
  2. zipファイルを作成し、そこに1のテキストファイルを追加(=zip圧縮)。


…というフローをループで処理させようとしていたのですが、一番目の
テキストファイルのみが圧縮され、二つ目以降のテキストファイルについては
全く圧縮されませんでした(´・ω・`)


どうやら、上記「1」でカレントディレクトリを変更してしまったままに
していたことが原因だったようで、上記のフローに
「元のディレクトリ(この場合はルートディレクトリ)に戻る」
処理を追加したところ、二つ目以降のテキストファイルも圧縮されるように
なりました(・∀・)