Расширение zip для PHP: варианты установки и примеры кода
Основные способы установки расширения zip для PHP
Как установить расширение zip в Linux через менеджер пакетов?
Наиболее простой и рекомендуемый способ для дистрибутивов Linux - использование системного пакетного менеджера. Расширение zip входит в состав стандартных пакетов PHP, но может отсутствовать в базовой установке.
# Для Debian/Ubuntu и производных
sudo apt update
sudo apt install php-zipрасширение zip php (установка расширения zip для php)
После установки необходимо перезапустить веб-сервер (Apache, Nginx) или PHP-FPM, чтобы изменения вступили в силу.
sudo systemctl restart apache2 # для Apache
sudo systemctl restart php8.1-fpm # указать версию PHP
- Пакет php-zip не найден - скорее всего, репозиторий не содержит пакета для вашей версии PHP. Проверьте версию PHP:
php -vи установите пакет, соответствующий версии, напримерphp8.2-zip. - Конфликт с другими версиями PHP - если в системе установлено несколько версий, указывайте полное имя пакета с версией.
- Расширение не загружается после установки - проверьте, что файл .ini создан в директории /etc/php/*/mods-available/ и включён (обычно это происходит автоматически).
Как включить расширение zip через php.ini, если оно уже скомпилировано?
Иногда расширение zip скомпилировано статически в PHP или присутствует в системе, но отключено директивой. Найдите файл php.ini и раскомментируйте строку extension=zip.
# Найти php.ini
php --ini
# Отредактировать (обычно /etc/php/*/cli/php.ini)
sudo nano /etc/php/8.1/cli/php.ini
# Найти и убрать точку с запятой перед extension=zip
- Строки
extension=zipможет не быть - значит расширение не скомпилировано, нужно устанавливать через пакетный менеджер или компилировать PHP заново. - После изменения php.ini необходимо перезапустить веб-сервер или PHP-FPM.
Как установить расширение zip для PHP на Windows?
В дистрибутиве PHP для Windows расширение zip обычно поставляется в виде DLL-файла. Нужно включить его в php.ini и убедиться, что файл присутствует.
# В php.ini раскомментировать строку
extension=zip
# Проверить, что файл php_zip.dll существует в папке ext
Если файл отсутствует, его можно скачать вместе с дистрибутивом PHP (обычно входит в полную сборку). После изменений перезапустите веб-сервер (IIS, Apache).
- Ошибка загрузки DLL - убедитесь, что версия расширения соответствует версии PHP (thread-safe или нет).
- Отсутствует библиотека zlib.dll - для работы zip требуется zlib, которая обычно есть в Windows или в папке PHP.
Как установить расширение zip через pecl?
Редкий, но возможный вариант - использование пакетного менеджера PECL. Расширение zip уже не поддерживается через pecl для современных версий PHP, но для старых может сработать.
sudo pecl install zip
После установки потребуется добавить extension=zip.so в php.ini.
- PECL может сообщить, что расширение устарело и предлагает использовать встроенную поддержку - в таком случае лучше использовать пакетный менеджер.
- Для работы потребуется установить php-dev и другие зависимости.
Как скомпилировать PHP с поддержкой zip из исходников?
Если требуется нестандартная конфигурация PHP, можно собрать его из исходного кода с опцией --with-zip. Этот вариант подходит для опытных администраторов.
./configure --with-zip --prefix=/usr/local/php
make
sudo make install
Убедитесь, что установлены пакеты разработки zlib (libzip-dev, zlib1g-dev).
- Отсутствие библиотеки libzip - установите её через системный менеджер.
- Конфликт с уже установленной версией PHP - указывайте другой путь.
Как проверить, что расширение zip работает?
Для проверки используйте команду:
php -m | grep zip
Вывод должен содержать zip. Также можно выполнить PHP-скрипт:
<?php
if (extension_loaded('zip')) {
echo "Расширение zip загружено";
} else {
echo "Расширение zip не найдено";
}
Примеры использования расширения zip в PHP
<?php
// Создание нового ZIP-архива
$zip = new ZipArchive();
$filename = '/tmp/example.zip';
if ($zip->open($filename, ZipArchive::CREATE | ZipArchive::OVERWRITE) === TRUE) {
// Добавление файла из строки
$zip->addFromString('hello.txt', 'Hello, world!');
// Добавление существующего файла
$zip->addFile('/etc/hostname', 'hostname.txt');
// Добавление директории (пустой)
$zip->addEmptyDir('subdir');
$zip->close();
echo "Архив создан: $filename\n";
} else {
echo "Ошибка создания архива\n";
}
?>
Архив создан: /tmp/example.zip
<?php
// Извлечение ZIP-архива
$zip = new ZipArchive();
$res = $zip->open('/tmp/example.zip');
if ($res === TRUE) {
$zip->extractTo('/tmp/extract/');
$zip->close();
echo "Извлечение завершено\n";
} else {
echo "Ошибка открытия архива (код: $res)\n";
}
?>
Извлечение завершено
<?php
// Получение информации об архиве
$zip = new ZipArchive();
if ($zip->open('/tmp/example.zip') === TRUE) {
echo "Количество файлов: " . $zip->numFiles . "\n";
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
echo "Файл {$i}: {$stat['name']} ({$stat['size']} байт)\n";
}
$zip->close();
}
?>
Количество файлов: 3 Файл 0: hello.txt (13 байт) Файл 1: hostname.txt (5 байт) Файл 2: subdir/ (0 байт)
<?php
// Работа с паролем (шифрование) - доступно с PHP 7.2+
$zip = new ZipArchive();
$zip->open('/tmp/encrypted.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
$zip->setPassword('secret');
$zip->addFromString('secure.txt', 'Этот файл защищён паролем');
$zip->close();
echo "Зашифрованный архив создан\n";
// Извлечение зашифрованного архива
$zip2 = new ZipArchive();
$zip2->open('/tmp/encrypted.zip');
$zip2->setPassword('secret');
$zip2->extractTo('/tmp/extract_enc/');
$zip2->close();
?>
Зашифрованный архив создан
<?php
// Проверка поддержки расширения и версии
if (class_exists('ZipArchive')) {
echo "ZipArchive доступен\n";
$v = ZipArchive::getLibVersion();
echo "Версия библиотеки libzip: $v\n";
} else {
echo "ZipArchive не найден\n";
}
?>
ZipArchive доступен Версия библиотеки libzip: 1.7.3
<?php
// Создание архива со сжатием
$zip = new ZipArchive();
$zip->open('/tmp/compressed.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
// Установка метода сжатия (по умолчанию ZipArchive::CM_DEFAULT)
$zip->setCompressionIndex(0, ZipArchive::CM_DEFLATE);
$zip->addFromString('data.txt', str_repeat('A', 10000));
$zip->close();
echo "Файл добавлен со сжатием\n";
?>
Файл добавлен со сжатием
<?php
// Удаление файла из архива
$zip = new ZipArchive();
$zip->open('/tmp/example.zip');
$zip->deleteName('hello.txt');
$zip->close();
echo "Файл удалён\n";
?>
Файл удалён
<?php
// Использование потоков (php://temp)
$zip = new ZipArchive();
$zip->open('/tmp/stream.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);
$zip->addFromString('stream.txt', 'Данные из потока');
$zip->close();
// Чтение архива через поток
echo file_get_contents('zip:///tmp/stream.zip#stream.txt');
?>
Данные из потока