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, доступный с PHP 5.2.0. Он предоставляет более удобный интерфейс для работы с архивами:
$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
$content = $zip->getFromName('file.txt');
// Закрытие происходит автоматически при вызове close()
$zip->close();
}При использовании процедурного стиля функций zip_*, важно различать:
zip_entry_close()- закрывает отдельную записьzip_close()- закрывает весь архив
Класс ZipArchive предпочтительнее в новых проектах из-за более полного функционала и лучшей обработки ошибок.
Аналоги в других языках программирования
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zip_ref:
with zip_ref.open('file.txt') as file:
content = file.read()
# Закрытие происходит автоматически в контекстном менеджереconst AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
const entry = zip.getEntry('file.txt');
const content = entry.getData().toString('utf8');
// Явное закрытие не требуется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 4.1.0: первоначальное появление функции в составе модуля ZZIPlib.
- PHP 5.2.0: введение класса
ZipArchiveкак рекомендуемой альтернативы. - PHP 8.0.0: процедурные функции
zip_*, включаяzip_entry_close(), перемещены в модуль Zip, который необходимо явно подключать. - PHP 8.1.0: улучшены сообщения об ошибках при работе с некорректными ресурсами.
Функция сохраняется для обратной совместимости, но новые проекты рекомендуется разрабатывать с использованием класса ZipArchive.
Расширенные примеры использования
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
$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
)