Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 폴더(디렉토리)를 ZIP 파일로 압축하는 방법 – ZipArchive 클래스 활용법

PHP에서는 기본 제공되는 ZipArchive 클래스를 사용하여 폴더(디렉토리)를 간단하게 압축(zip)하거나 압축 해제할 수 있습니다. PHP 5.3 버전부터 이 클래스가 내장되어 있어 별도의 라이브러리 설치 없이 바로 사용할 수 있습니다.

단, 윈도우 환경에서 사용하려면 php.ini 설정 파일에서 php_zip.dll 확장 모듈이 활성화되어 있는지 확인해야 합니다.

기본 예제 코드

<?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)) {
            $newzip->addFile($pathdir.$file, $file);
        }
    }
    $newzip->close();
}
?>

코드 동작 방식

  • $pathdir: 압축하고자 하는 원본 디렉토리의 경로입니다.
  • $zipcreated: 생성될 zip 파일의 이름입니다.
  • ZipArchive::CREATE 옵션을 통해 zip 파일이 존재하지 않으면 새로 생성합니다.
  • opendir()readdir()로 디렉토리 내부를 순회하며, is_file()로 확인된 일반 파일만 addFile() 메서드로 추가합니다.

하위 디렉토리까지 포함해서 압축하기

위 예제는 최상위 폴더의 파일만 압축합니다. 하위 폴더와 그 안의 파일까지 모두 포함하려면 RecursiveDirectoryIterator를 활용하는 것이 좋습니다.

<?php
$source = 'Directory Name/';
$zip = new ZipArchive();
$zip->open('test.zip', ZipArchive::CREATE);

$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($source),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $file) {
    if (!$file->isDir()) {
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen(realpath($source)) + 1);
        $zip->addFile($filePath, $relativePath);
    }
}

$zip->close();
?>

이처럼 PHP의 ZipArchive 클래스를 활용하면 외부 도구 없이 순수 PHP 코드만으로 디렉토리 백업, 다운로드용 압축 파일 생성 등 다양한 작업을 효율적으로 처리할 수 있습니다.