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

Работа с zip_close в PHP и закрытие архивов
Раздел: Архивация
zip_close(resource zip): void
Описание функции zip_close

Функция zip_close() закрывает активный дескриптор ZIP-архива, открытый с помощью функции zip_open. После выполнения операции освобождаются системные ресурсы, связанные с этим дескриптором.

Использование функции происходит после завершения работы с содержимым архива — чтения или извлечения файлов.

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

  • $zip (ресурс) — дескриптор ZIP-архива, полученный с помощью функции zip_open.

Возвращаемое значение: null. Функция не генерирует исключительных ситуаций при успешном выполнении.

В современных версиях PHP применение этой функции потеряло актуальность из-за перехода на объектно-ориентированный интерфейс класса ZipArchive.

Примеры применения функции
Базовое использование

Закрытие архива после чтения:

<?php
$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        echo $name . "\n";
    }
    zip_close($zip); // Закрытие дескриптора
}
?>
file1.txt
image.jpg
document.pdf
Похожие функции в PHP

Альтернативой процедурному подходу является объектно-ориентированный класс ZipArchive.

  • ZipArchive::close() — метод закрывает активный архив и сохраняет изменения. Предпочтительнее использовать в PHP 5.2 и выше из-за более широкой функциональности и поддержки.
  • zip_read() и zip_entry_* — семейство процедурных функций для пошагового чтения архива, которые требуют обязательного вызова zip_close.

Класс ZipArchive рекомендуется для нового кода, поскольку поддерживает создание, модификацию архивов и предоставляет более удобный API.

Аналоги в других языках
Python

Используется контекстный менеджер или метод close():

import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zf:
    for name in zf.namelist():
        print(name)
# Архив закрывается автоматически
JavaScript (Node.js)

Библиотека adm-zip не требует явного закрытия:

const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
zip.getEntries().forEach(entry => {
    console.log(entry.name);
});
// Явное закрытие не требуется
MySQL

Прямых аналогов нет, поскольку СУБД не специализируется на работе с ZIP-архивами.

Типичные ошибки
Передача неверного типа аргумента
<?php
zip_close('not_a_resource'); // Передача строки вместо ресурса
?>
Warning: zip_close() expects parameter 1 to be resource, string given
Попытка повторного закрытия
<?php
$zip = zip_open('archive.zip');
zip_close($zip);
zip_close($zip); // Дескриптор уже закрыт
?>
Warning: zip_close(): supplied resource is not a valid Zip Directory resource
История изменений
  • В PHP 8.0.0 функция была удалена из ядра языка вместе со всем процедурным API работы с ZIP-архивами. При попытке вызова возникает фатальная ошибка.
  • В PHP 7.4.0 использование процедурных функций вызывало уведомления об устаревании.
  • Рекомендуется заменить вызовы zip_close на метод ZipArchive::close().
Расширенные примеры
Обработка нескольких архивов
Пример php
<?php
$archives = ['arc1.zip', 'arc2.zip'];
foreach ($archives as $file) {
    if (file_exists($file)) {
        $zip = zip_open($file);
        if (is_resource($zip)) {
            echo "Содержимое $file:\n";
            while ($entry = zip_read($zip)) {
                echo zip_entry_name($entry) . "\n";
            }
            zip_close($zip); // Закрытие каждого архива
        }
    }
}
?>
Использование с zip_entry_read
Пример php
<?php
$zip = zip_open('data.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        if (zip_entry_open($zip, $entry, 'r')) {
            $content = zip_entry_read($entry, 1024);
            echo "Прочитано: " . strlen($content) . " байт\n";
            zip_entry_close($entry);
        }
    }
    zip_close($zip);
}
?>

PHP zip_close function comments

En
Zip close Close a ZIP file archive