Zip close: примеры (PHP)
zip_close(resource zip): voidФункция 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
Альтернативой процедурному подходу является объектно-ориентированный класс ZipArchive.
- ZipArchive::close() — метод закрывает активный архив и сохраняет изменения. Предпочтительнее использовать в PHP 5.2 и выше из-за более широкой функциональности и поддержки.
- zip_read() и zip_entry_* — семейство процедурных функций для пошагового чтения архива, которые требуют обязательного вызова
zip_close.
Класс ZipArchive рекомендуется для нового кода, поскольку поддерживает создание, модификацию архивов и предоставляет более удобный API.
Используется контекстный менеджер или метод close():
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zf:
for name in zf.namelist():
print(name)
# Архив закрывается автоматическиБиблиотека adm-zip не требует явного закрытия:
const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
zip.getEntries().forEach(entry => {
console.log(entry.name);
});
// Явное закрытие не требуетсяПрямых аналогов нет, поскольку СУБД не специализируется на работе с 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
$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); // Закрытие каждого архива
}
}
}
?><?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);
}
?>