PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPでディレクトリをZIP圧縮する方法|ZipArchiveクラスの使い方を解説

PHPでは、標準搭載されている ZipArchive クラスを使うことで、フォルダ(ディレクトリ)のZIP圧縮・解凍を簡単に行うことができます。

ZipArchiveクラスは PHP 5.3 以降であればデフォルトで組み込まれているため、追加のインストールは不要です。ただしWindows環境で利用する場合は、php.ini の設定で extension=php_zip.dll を有効にする必要があるので注意しましょう。

ディレクトリをZIP圧縮するサンプルコード

以下は、指定したディレクトリ内のすべてのファイルを1つのZIPファイルにまとめる基本的な例です。

<?php
// 圧縮したいディレクトリ名
$pathdir = "Directory Name/";
// 作成するZIPファイル名
$zipcreated = "test.zip";
// ZipArchiveクラスのインスタンスを作成
$newzip = new ZipArchive;
if ($newzip->open($zipcreated, ZipArchive::CREATE) === TRUE) {
    $dir = opendir($pathdir);
    while ($file = readdir($dir)) {
        if (is_file($pathdir . $file)) {
            // ファイルをZIPアーカイブに追加
            $newzip->addFile($pathdir . $file, $file);
        }
    }
    closedir($dir);
    $newzip->close();
}
?>

コードのポイント解説

1. ディレクトリとファイル名の指定
$pathdir には圧縮対象のディレクトリ、$zipcreated には出力するZIPファイル名を指定します。

2. アーカイブのオープン
open() メソッドの第2引数に ZipArchive::CREATE を渡すことで、ZIPファイルが存在しない場合は新規作成されます。処理が成功すると TRUE が返ります。

3. ファイルの走査と追加
readdir() でディレクトリ内を順に読み込み、is_file() でファイルかどうかを判定した上で、addFile() を使ってアーカイブへ追加しています。... といったカレントディレクトリ参照は自動的に除外されます。

4. リソースの解放
処理が完了したら closedir() でディレクトリハンドルを閉じ、close() でZIPアーカイブを確定・保存します。

補足:サブディレクトリも含めて再帰的に圧縮したい場合

上記のコードは直下のファイルのみを対象としています。サブフォルダまで含めて圧縮したい場合は、再帰処理や RecursiveIteratorIterator(RecursiveDirectoryIterator)を組み合わせることで対応可能です。

<?php
$sourceDir = "Directory Name";
$zipFile = "test.zip";
$zip = new ZipArchive;
if ($zip->open($zipFile, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($sourceDir),
        RecursiveIteratorIterator::LEAVES_ONLY
    );
    foreach ($files as $file) {
        if (!$file->isDir()) {
            $filePath = $file->getRealPath();
            $relativePath = substr($filePath, strlen(realpath($sourceDir)) + 1);
            $zip->addFile($filePath, $relativePath);
        }
    }
    $zip->close();
}
?>

このようにZipArchiveクラスを使いこなせば、バックアップ処理やダウンロード用ファイルの生成など、さまざまな場面で活用できます。

  1. PHPのis_dir()関数とは?使い方とサンプルコードをわかりやすく解説

    PHPのis_dir()関数は、指定したパスがディレクトリ(フォルダ)であるかどうかを判定するための関数です。指定されたパスが実際に存在するディレクトリであれば TRUE を返し、そうでなければ FALSE を返します。ファイル操作やアップロード処理など、対象がファイルなのかディレクトリなのかを事前に確認したい場面でよく使われる、非常に便利な関数です。基本構文is_dir(ファイルパス)パラメータfile_path(ファイルパス): 判定対象となるファイルまたはディレクトリへのパスを文字列で指定します。相対パスと絶対パスのどちらも使用できます。戻り値指定したパスが存在するディレクトリであれば

  2. PHPのdirname()関数の使い方を徹底解説!パスからディレクトリ名を取得する方法

    PHPのdirname()関数は、指定されたパスからディレクトリ名(親ディレクトリのパス)を取得するための組み込み関数です。ファイル操作やパス処理を行う際に非常に便利な関数で、パスにスラッシュが含まれていない場合は、カレントディレクトリを示すドット(.)が返されます。 構文 dirname(string $path, int $levels = 1): string パラメータ $path − ディレクトリ名を取得したい対象のファイルパスを指定します。 $levels − (PHP 7以降)さかのぼる親ディレクトリの階層数を指定します。デフォルト値は「1」です。 戻り値 dirname()