Работа с ZIP-архивами в PHP: полное руководство по ZipArchive

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с 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', 'Строка для записи в файл внутри архива');
?>

Рекомендаций