[PHP]ZipArchiveクラスを使ってzipファイルを作成する

Read More


PHPのZipArchiveクラスを使ってzipファイルを作成する。

関連ページ
■[PHP]ZipArchiveクラスを使ってzipファイルを解凍する
http://xirasaya.com/?m=detail&hid=545


前回の記事でも書いたがPHP5.2.0からZipArchiveクラスが使えるようになった。
ZipArchiveクラスを用いたzipファイルの作成方法をメモとして残しておく。

■zipファイルを作成する
$chk=true;
$zip = new \ZipArchive();
$flags = \ZipArchive::CREATE | \ZipArchive::OVERWRITE;

if($chk = $zip->open($zip_file_path, $flags))
{
  foreach($files as $file)
  {
    if($chk) $chk = $zip->addFile($file, basename($file));
  }
  $zip->close();
}

echo $chk;

$filesにはzipファイルにしたいファイルパスを配列内に格納しておく。
これが基本系。


次に一連の処理を関数化。

■一連のzipファイル作成処理を関数化
function create_zip($zip_file_path=null, array $files=array())
{
  $zip = new \ZipArchive();
  $flags = \ZipArchive::CREATE | \ZipArchive::OVERWRITE;

  if(!$zip->open($zip_file_path, $flags))
  {
    throw new \RuntimeException("{$zip_file_path}の作成に失敗しました。");
  }

  foreach($files as $file)
  {
    if(!$zip->addFile($file, basename($file)))
    {
      $zip->close();
      if(file_exists($zip_file_path))
      {
        @unlink($zip_file_path);
      }
      throw new \RuntimeException("{$zip_file_path}の作成に失敗しました。");
    }
  }
  $zip->close();
}


上記のものはエラー時にthrow newで例外を発生させているが個人的には好きではない。
自分でいちいち発生させると可読性が落ちるのもあるが、以降の処理がぷっつりと終わるのが気に入らない。
関数ならばきっちりreturnで成否を返してその後の処理を戻り先で自分で書く方がいい。

PHP4の頃はtrycatchがなかったため例外の書き方が未だに自分の中できちんと消化できてないってのが使いたくない一番の理由かも。

参考にできるほどtrycatchの使い方に一貫性があって、かつ説得力のある書き方ができてる人って決して多くないような気がする。

まあ最終的には自分の勉強不足なだけなんだけど。




--2017/06/21 プログラム修正
一部処理がおかしいところがあったので修正