Введение в работу с ZIP-архивами в PHP
Архивация данных — одна из базовых задач веб-разработки. Будь то резервное копирование базы данных, упаковка загруженных пользователем файлов или экспорт большого объёма информации — ZIP-формат остаётся самым популярным и универсальным решением. PHP предоставляет встроенный класс ZipArchive, который позволяет выполнять все основные операции с ZIP-архивами без установки дополнительных расширений.
В этой статье мы подробно разберём, как использовать ZipArchive в PHP: от создания простого архива до обработки вложенных папок и защиты паролем. Все примеры кода готовы к использованию на вашем сервере.
Подготовка к работе: проверка расширения Zip
Прежде чем начать, убедитесь, что на вашем сервере включено расширение zip. Обычно оно установлено по умолчанию в современных версиях PHP (7.4+, 8.x). Проверить это можно с помощью функции phpinfo() или простого скрипта:
<?php
if (extension_loaded('zip')) {
echo 'Расширение Zip доступно';
} else {
echo 'Расширение Zip не найдено. Установите его через php.ini';
}
?>
Создание ZIP-архива в PHP
Шаг 1. Инициализация объекта ZipArchive
Для начала работы создайте экземпляр класса ZipArchive и откройте новый архив с помощью метода open(). Второй параметр — флаг ZipArchive::CREATE — указывает, что архив будет создан заново (или перезаписан, если уже существует).
<?php
$zip = new ZipArchive();
$zipName = 'example.zip';
if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) {
exit("Не удалось создать архив $zipName");
}
?>
Шаг 2. Добавление файлов в архив
Метод addFile() добавляет существующий файл из файловой системы. Первый аргумент — путь к файлу, второй (необязательный) — имя файла внутри архива (если хотите переименовать).
<?php
// Добавляем один файл
$zip->addFile('document.pdf', 'my_document.pdf');
// Добавляем несколько файлов
$files = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg'];
foreach ($files as $file) {
$zip->addFile($file);
}
?>
Шаг 3. Добавление целой папки с сохранением структуры
Если нужно упаковать каталог со всеми вложенными файлами, используйте рекурсивный обход. Вот готовая функция:
<?php
function addFolderToZip($zip, $folder, $parentFolder = '') {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($folder),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = $parentFolder . $file->getFilename();
$zip->addFile($filePath, $relativePath);
}
}
}
// Использование:
$zip->addEmptyDir('my_folder'); // создаём папку в архиве
addFolderToZip($zip, '/path/to/source_folder', 'my_folder/');
?>
Шаг 4. Закрытие архива
После добавления всех файлов обязательно закройте архив — иначе данные не будут записаны.
<?php
$zip->close();
echo "Архив $zipName успешно создан!";
?>
Распаковка ZIP-архива в PHP
Для извлечения файлов используется метод extractTo(). Укажите целевую папку, куда будут распакованы файлы.
<?php
$zip = new ZipArchive();
if ($zip->open('example.zip') === TRUE) {
$zip->extractTo('/path/to/extract_folder/');
$zip->close();
echo 'Архив успешно распакован';
} else {
echo 'Ошибка открытия архива';
}
?>
Продвинутые возможности ZipArchive
Добавление строки как файла
Метод addFromString() позволяет создать файл прямо из строки — удобно для генерации отчётов или логов.
<?php
$zip->addFromString('log.txt', 'Строка для записи в файл внутри архива');
?>