Zip open: примеры (PHP)

Руководство по использованию zip_open для работы с архивами
Раздел: Архивация
zip_open(string filename): resource|false

Описание функции zip_open

Функция zip_open() является частью модуля Zip в PHP и предназначена для открытия ZIP-архива для последующего чтения. Она создаёт ресурс (дескриптор) архива, который используется другими функциями, такими как zip_read() и zip_entry_open(), для итерации по содержимому и извлечения данных. Эта функция полезна для поэлементной обработки архива без необходимости его полной распаковки в память.

Аргументы функции

Функция принимает один обязательный аргумент:

  • $filename (string) - Путь к файлу ZIP-архива, который необходимо открыть.

Возвращаемое значение: в случае успеха функция возвращает ресурс (resource), который представляет открытый архив. Если произошла ошибка, возвращается FALSE, а также устанавливается соответствующая ошибка, которую можно получить с помощью функций вроде zip_error().

Примеры использования zip_open

Базовый пример: открытие архива
<?php
$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    echo 'Архив успешно открыт.';
    zip_close($zip);
} else {
    echo 'Не удалось открыть архив.';
}
?>
Архив успешно открыт.
Пример с обработкой ошибки
<?php
$zip = zip_open('несуществующий_архив.zip');
if ($zip === false) {
    echo 'Ошибка: архив не найден или поврежден.';
}
?>
Ошибка: архив не найден или поврежден.

Похожие функции в PHP

В PHP существует несколько альтернативных способов работы с ZIP-архивами:

Класс ZipArchive

Объектно-ориентированный интерфейс, предоставляющий больше возможностей, чем процедурные функции. Поддерживает создание, изменение и извлечение архивов, работу с паролями и комментариями.

Класс PharData

Часть расширения Phar, позволяет работать с ZIP и TAR архивами. Предлагает высокоуровневый API для манипуляций с архивами, включая доступ к файлам как к потокам.

ZipArchive обычно предпочтительнее для нового кода из-за более богатого функционала и активной поддержки. zip_open() может использоваться в простых сценариях чтения или в устаревшем коде.

Типичные ошибки

Ошибка открытия несуществующего файла
<?php
$zip = zip_open('missing.zip');
var_dump($zip);
?>
bool(false)

Решение: проверять существование файла с помощью file_exists() до вызова функции.

Попытка чтения после закрытия ресурса
<?php
$zip = zip_open('archive.zip');
zip_close($zip);
$entry = zip_read($zip); // Неверно!
?>
Warning: zip_read(): supplied resource is not a valid Zip Directory resource

Решение: избегать использования закрытого ресурса.

Нехватка памяти для большого архива

При обработке очень больших архивов функция может исчерпать лимит памяти. Рекомендуется использовать пошаговое чтение и контролировать использование памяти.

Изменения в последних версиях PHP

В PHP 8.0.0 процедурные функции модуля Zip, включая zip_open(), не претерпели значительных изменений в поведении. Однако, официальная документация рекомендует использовать объектно-ориентированный API класса ZipArchive для нового кода, так как он более полнофункционален и современен. На данный момент нет объявлений об удалении этих процедурных функций, но их развитие заморожено.

Расширенные примеры

Поэлементное чтение и извлечение содержимого
Пример php
<?php
$zip = zip_open('archive.zip');
if (!is_resource($zip)) die('Ошибка открытия');

while ($entry = zip_read($zip)) {
    $name = zip_entry_name($entry);
    echo 'Элемент: ' . $name . '<br>';
    
    if (zip_entry_open($zip, $entry, 'r')) {
        $content = zip_entry_read($entry, zip_entry_filesize($entry));
        echo 'Размер содержимого: ' . strlen($content) . ' байт<br>';
        zip_entry_close($entry);
    }
}
zip_close($zip);
?>
Элемент: document.txt
Размер содержимого: 125 байт
Элемент: images/photo.jpg
Размер содержимого: 20489 байт
Фильтрация файлов по расширению при чтении
Пример php
<?php
$zip = zip_open('source.zip');
$allowed_ext = ['txt', 'csv'];

while ($entry = zip_read($zip)) {
    $name = zip_entry_name($entry);
    $ext = pathinfo($name, PATHINFO_EXTENSION);
    
    if (in_array($ext, $allowed_ext)) {
        echo 'Найден текстовый файл: ' . $name . '<br>';
        // Обработка файла
    }
}
zip_close($zip);
?>
Найден текстовый файл: data.csv
Найден текстовый файл: notes.txt
Обработка вложенной структуры директорий
Пример php
<?php
function listZipItems($zipResource, $prefix = '') {
    while ($entry = zip_read($zipResource)) {
        $name = zip_entry_name($entry);
        echo $prefix . $name . '<br>';
    }
}

$zip = zip_open('nested.zip');
listZipItems($zip, '- ');
zip_close($zip);
?>
- index.html
- css/style.css
- js/app.js
- images/icon.png

Альтернативы в других языках

Python (модуль zipfile)
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zip_ref:
    print(zip_ref.namelist())
['file1.txt', 'folder/file2.txt']

Отличие: Python использует контекстные менеджеры для автоматического закрытия архива, что удобнее и безопаснее.

JavaScript (Node.js, библиотека adm-zip)
const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
const zipEntries = zip.getEntries();
console.log(zipEntries.map(entry => entry.entryName));
[ 'file1.txt', 'folder/file2.txt' ]

Отличие: JS реализация асинхронна по природе и часто требует установки дополнительных пакетов.

Zip open в MySQL

Прямых аналогов для работы с ZIP-архивами на уровне SQL запросов не существует. Обычно работа с архивами происходит на уровне приложения или с помощью пользовательских функций, вызывающих системные утилиты.

PHP zip_open function comments

En
Zip open Open a ZIP file archive