【PHP】ZipArchiveでフォルダ(ディレクトリ)圧縮する方法

自己責任で!!
プログラムソースを検証して、動作確認したうえでご利用ください。
たとえば、バックアップをとったが、必要なファイルがなかったとかいうことがあると困るかと思います

はじめに

PHPでzipコマンドを呼び出してやるのが簡単なのですが、無料のレンタルサーバー(例えば、スターサーバーフリー)では制限がかかっていてできない場合があります。

そういう時に、PHPのZipArchiveで代用できないか?っていう話です。ZipArchiveはフォルダー圧縮をサポートしていません。

参考

//https://www.php.net/manual/ja/function.rmdir.php
function rrmdir($src) {
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
            $full = $src . '/' . $file;
            if ( is_dir($full) ) {
                rrmdir($full);
            }
            else {
                unlink($full);
            }
        }
    }
    closedir($dir);
    rmdir($src);
}

PHP: rmdir - Manual

PHPマニュアルに掲載されている上記のサンプルを参考にします。上記は指定したフォルダの中身をすべて削除するものです。再帰呼び出しを利用して実現しています。

ZipArchiveでフォルダ(ディレクトリ)圧縮

<?php
function zipSub($za,$src,$parent= '') {
    $dir = opendir($src);
    while(false !== ( $file = readdir($dir)) ) {
        if (( $file != '.' ) && ( $file != '..' )) {
           $local = $parent.$file;
           $full  = $src . '/' . $file;
            if ( is_dir($full) ) {
                $za->addEmptyDir($local);
                zipSub($za, $full, $local.'/');
            }
            else {
                $za->addFile($full, $local);
            }
        }
    }
    closedir($dir);
}

function zip($path, $zipfile)
{
    $za = new ZipArchive();
    $za->open($zipfile, ZIPARCHIVE::CREATE);
    zipSub($za, $path);
    $za->close();
}

//---------
// MAIN
//---------
zip('./wp-content', './wp-content.zip');

上記のような感じで実現できます。

zip(圧縮したいフォルダ、保存するzipファイル名)
zip('./wp-content', './wp-content.zip');

使い方はこんな感じです。

たとえば、上記のPHPをWordpressのインストールフォルダの直下において実行させると、「/wp-content」フォルダが、フォルダ構造を保ったままzip圧縮されます。

スポンサーリンク