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

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

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

Начать курс

Введение в работу с ZIP-архивами на PHP

Создание и обработка ZIP-архивов — одна из частых задач в веб-разработке. На PHP эта задача решается с помощью встроенного расширения Zip, которое предоставляет мощный и удобный класс ZipArchive. С его помощью вы можете создавать новые архивы, распаковывать существующие, добавлять или удалять файлы, а также работать с метаданными.

В этой статье мы подробно разберём все основные операции с ZIP-архивами на PHP: от простого создания до обработки ошибок и работы с паролями. Все примеры готовы к использованию в ваших проектах.

Подготовка к работе: проверка наличия расширения Zip

Прежде чем начать, убедитесь, что расширение zip установлено и включено на вашем сервере. Проверить это можно с помощью функции phpinfo() или простым скриптом:

<?php
if (extension_loaded('zip')) {
    echo "Расширение Zip доступно";
} else {
    echo "Расширение Zip не найдено";
}
?>

Если расширение отсутствует, установите его через пакетный менеджер вашей ОС (например, apt install php-zip для Ubuntu) или включите в файле php.ini.

Создание нового ZIP-архива

Самый простой способ создать архив — открыть новый файл в режиме записи и добавить в него файлы. Рассмотрим базовый пример:

<?php
$zip = new ZipArchive();
$filename = 'example.zip';

// Создаём новый архив (ZIPARCHIVE::CREATE)
if ($zip->open($filename, ZipArchive::CREATE) === TRUE) {
    // Добавляем файл из локальной файловой системы
    $zip->addFile('/path/to/file1.txt', 'file1.txt');
    // Добавляем строку как новый файл в архиве
    $zip->addFromString('hello.txt', 'Привет, мир!');
    // Добавляем целую папку (рекурсивно)
    $zip->addGlob('/path/to/dir/*.*');
    
    $zip->close();
    echo "Архив $filename создан успешно";
} else {
    echo "Ошибка создания архива";
}
?>

Обратите внимание: второй параметр addFile() — это имя файла внутри архива. Если его не указать, файл сохранится с оригинальным именем.

Распаковка ZIP-архива

Извлечение файлов из архива выполняется методом extractTo(). Укажите целевую папку, куда будут распакованы файлы:

<?php
$zip = new ZipArchive();
if ($zip->open('example.zip') === TRUE) {
    // Распаковать всё в папку 'unpacked'
    $zip->extractTo('/path/to/unpacked/');
    $zip->close();
    echo "Архив распакован";
} else {
    echo "Ошибка открытия архива";
}
?>

Если нужно извлечь только определённые файлы, передайте их список третьим аргументом:

$zip->extractTo('/path/to/unpacked/', ['file1.txt', 'hello.txt']);

Просмотр содержимого архива

Иногда требуется получить список файлов внутри архива без его распаковки. Для этого используйте свойства и методы ZipArchive:

<?php
$zip = new ZipArchive();
if ($zip->open('example.zip') === TRUE) {
    echo "Количество файлов: " . $zip->numFiles . "<br>";
    
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat = $zip->statIndex($i);
        echo "Файл: " . $stat['name'] . " (размер: " . $stat['size'] . " байт)<br>";
    }
    
    $zip->close();
}
?>

Добавление файлов с сохранением структуры папок

Чтобы сохранить иерархию каталогов при добавлении, используйте относительные пути в имени файла внутри архива:

<?php
$zip = new ZipArchive();
$zip->open('backup.zip', ZipArchive::CREATE);

// Добавляем файл с сохранением подпапки
$zip->addFile('/var/www/images/photo.jpg', 'images/photo.jpg');
// Или рекурсивно всю папку
$zip->addPattern('/\.(jpg|png)$/', '/var/www/images/', ['add_path' => 'images/']);

$zip->close();
?>

Удаление файлов из архива

Удалить конкретный файл можно методом deleteName(). Важно: архив должен быть открыт в режиме записи (ZipArchive::CREATE или ZipArchive::OVERWRITE):

                
    
    

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