Введение в работу с 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):
Также в библиотеке
Работа с датами в Swift: Foundation, SwiftDate, DateTools (iOS/macOS)
Работа с YAML в Node.js: библиотеки js-yaml и yaml
Работа с Excel в PHP: библиотеки PhpSpreadsheet и OpenSpout
Dependency Injection контейнер для PHP: Полное руководство по внедрению зависимостей
JsonWebToken для JavaScript (Node.js): полное руководство с примерами
Рекомендаций