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 코드만으로 디렉토리 백업, 다운로드용 압축 파일 생성 등 다양한 작업을 효율적으로 처리할 수 있습니다.