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

Использование zip_entry_close для обработки архивов в PHP
Раздел: Архивация
zip_entry_close(resource zip_entry): void

Основные сведения о функции zip_entry_close

Назначение и применение

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

Синтаксис и аргументы

Синтаксис функции:

bool zip_entry_close(resource $zip_entry)

Единственный параметр:

  • zip_entry (обязательный) - ресурс, представляющий открытую запись в ZIP-архиве, полученный с помощью zip_entry_open().

Возвращаемое значение: логическое значение TRUE при успешном закрытии или FALSE при возникновении ошибки.

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

Базовое закрытие записи архива

Пример закрытия записи после чтения её содержимого:

$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $entry_name = zip_entry_name($entry);
        
        if (zip_entry_open($zip, $entry)) {
            $content = zip_entry_read($entry, zip_entry_filesize($entry));
            // Обработка содержимого
            $result = zip_entry_close($entry);
            echo "Запись $entry_name закрыта: " . ($result ? 'успешно' : 'ошибка');
        }
    }
    zip_close($zip);
}
Запись document.txt закрыта: успешно
Запись image.jpg закрыта: успешно

Альтернативные функции в PHP

Класс ZipArchive

Современная объектно-ориентированная альтернатива - класс ZipArchive, доступный с PHP 5.2.0. Он предоставляет более удобный интерфейс для работы с архивами:

$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
    $content = $zip->getFromName('file.txt');
    // Закрытие происходит автоматически при вызове close()
    $zip->close();
}
Функция zip_read() в комбинации с zip_close()

При использовании процедурного стиля функций zip_*, важно различать:

  • zip_entry_close() - закрывает отдельную запись
  • zip_close() - закрывает весь архив

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

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

Python: модуль zipfile
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zip_ref:
    with zip_ref.open('file.txt') as file:
        content = file.read()
    # Закрытие происходит автоматически в контекстном менеджере
JavaScript (Node.js): модуль adm-zip
const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
const entry = zip.getEntry('file.txt');
const content = entry.getData().toString('utf8');
// Явное закрытие не требуется
Java: java.util.zip
try (ZipFile zipFile = new ZipFile("archive.zip")) {
    ZipEntry entry = zipFile.getEntry("file.txt");
    try (InputStream is = zipFile.getInputStream(entry)) {
        // Чтение содержимого
    }
    // Закрытие автоматическое в try-with-resources
}

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

Типичные ошибки использования

Попытка закрыть уже закрытую запись
$zip = zip_open('archive.zip');
$entry = zip_read($zip);
zip_entry_open($zip, $entry);
zip_entry_close($entry);
// Повторное закрытие вызовет предупреждение
$result = zip_entry_close($entry);
Warning: zip_entry_close(): supplied resource is not a valid Zip Entry resource
Закрытие записи без предварительного открытия
$zip = zip_open('archive.zip');
$entry = zip_read($zip);
// Пропущен вызов zip_entry_open()
$result = zip_entry_close($entry);
Функция вернет FALSE без детализации ошибки
Использование некорректного ресурса
$invalid_resource = fopen('file.txt', 'r');
$result = zip_entry_close($invalid_resource);
Warning: zip_entry_close(): supplied resource is not a valid Zip Entry resource

История изменений функции

Эволюция в версиях PHP
  • PHP 4.1.0: первоначальное появление функции в составе модуля ZZIPlib.
  • PHP 5.2.0: введение класса ZipArchive как рекомендуемой альтернативы.
  • PHP 8.0.0: процедурные функции zip_*, включая zip_entry_close(), перемещены в модуль Zip, который необходимо явно подключать.
  • PHP 8.1.0: улучшены сообщения об ошибках при работе с некорректными ресурсами.
Текущий статус

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

Расширенные примеры использования

Пакетная обработка записей с проверкой
Пример php
function processZipEntries($filename) {
    if (!extension_loaded('zip')) {
        return "Модуль Zip не загружен";
    }
    
    $zip = zip_open($filename);
    if (!is_resource($zip)) {
        return "Не удалось открыть архив";
    }
    
    $processed = 0;
    $errors = 0;
    
    while ($entry = zip_read($zip)) {
        $entry_name = zip_entry_name($entry);
        
        if (zip_entry_open($zip, $entry, 'rb')) {
            $size = zip_entry_filesize($entry);
            
            if ($size > 0) {
                $content = zip_entry_read($entry, $size);
                // Сложная обработка содержимого
                $hash = md5($content);
            }
            
            if (zip_entry_close($entry)) {
                $processed++;
                echo "Обработана запись: $entry_name (размер: $size байт)\n";
            } else {
                $errors++;
                echo "Ошибка закрытия записи: $entry_name\n";
            }
        }
    }
    
    zip_close($zip);
    return "Обработано: $processed, ошибок: $errors";
}

echo processZipEntries('data.zip');
Обработана запись: documents/report.pdf (размер: 2048576 байт)
Обработана запись: config.json (размер: 1024 байт)
Обработано: 2, ошибок: 0
Извлечение с ограничением по типу файлов
Пример php
$allowed_extensions = ['txt', 'csv', 'json'];
$zip = zip_open('archive.zip');
$extracted = [];

while ($entry = zip_read($zip)) {
    $name = zip_entry_name($entry);
    $ext = pathinfo($name, PATHINFO_EXTENSION);
    
    if (in_array($ext, $allowed_extensions) && zip_entry_open($zip, $entry)) {
        $content = zip_entry_read($entry, zip_entry_filesize($entry));
        file_put_contents("extracted/$name", $content);
        $extracted[] = $name;
        zip_entry_close($entry);
    }
}
zip_close($zip);

print_r($extracted);
Array
(
    [0] => data/report.txt
    [1] => logs/error.log
    [2] => config.json
)

PHP zip_entry_close function comments

En
Zip entry close Close a directory entry