zip_entry_open()
Функция zip_entry_open() в PHP открывает запись в zip-архиве для чтения. Устарела в PHP 7.4 и удалена в PHP 8.0.
⚠️ Уведомление об устаревании: Функция zip_entry_open() относится к устаревшему расширению zip, которое было объявлено устаревшим в PHP 7.4 и удалено в PHP 8.0. Приведённые ниже примеры носят исключительно исторический характер. В современных PHP-приложениях используйте класс ZipArchive.
zip_entry_open() подготавливает отдельную запись (файл) внутри открытого zip-архива, чтобы её содержимое можно было прочитать. Функция работает в связке с zip_open(), zip_read() и zip_entry_read(): вы открываете архив, переходите к записи, открываете её, а затем читаете из неё. Без предварительного вызова zip_entry_open() функция zip_entry_read() не сможет ничего прочитать.
На этой странице описаны сигнатура функции, её параметры и возвращаемое значение, полный пример чтения записи, а также — что важнее всего — современная замена ZipArchive, которую следует использовать сегодня.
Синтаксис
resource zip_entry_open(resource $zip, resource $zip_entry, string $mode = "r")Параметры
| Параметр | Описание |
|---|---|
$zip | Дескриптор архива, возвращённый функцией zip_open(). |
$zip_entry | Дескриптор записи, возвращённый функцией zip_read(). |
$mode | Режим доступа. Устаревшее расширение zip поддерживало только чтение, поэтому на практике всегда используется значение "r". |
Четвёртый аргумент
$password, встречающийся в некоторых старых документациях, никогда не работал в поставляемом расширенииzipи игнорировался.
Возвращаемое значение
Возвращает true в случае успеха или false в случае ошибки. Несмотря на историческую подсказку типа resource, новый дескриптор не возвращается — вы по-прежнему передаёте тот же дескриптор $zip_entry в zip_entry_read().
Пример использования
Пример: чтение файла из zip-архива
Откройте архив, перейдите к записи, откройте её, прочитайте и освободите ресурсы:
$zip = zip_open("example.zip");
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
// Prepare this entry for reading
if (zip_entry_open($zip, $zip_entry, "r")) {
$name = zip_entry_name($zip_entry);
$contents = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
echo "$name: $contents\n";
zip_entry_close($zip_entry);
}
}
zip_close($zip);
}Здесь zip_open() открывает архив, zip_read() переходит к каждой записи поочерёдно, zip_entry_open() делает текущую запись доступной для чтения, а zip_entry_read() возвращает её байты. Всегда сопровождайте каждое успешное открытие вызовом zip_entry_close(), а по окончании работы закрывайте архив с помощью zip_close().
Современная альтернатива: класс ZipArchive
Чтобы получить тот же результат в PHP 8.0+, используйте встроенный класс ZipArchive:
$zip = new ZipArchive;
if ($zip->open('example.zip') === true) {
// Loop over every entry by index
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$contents = $zip->getFromIndex($i);
echo "$name: $contents\n";
}
$zip->close();
}Классу ZipArchive не нужен отдельный шаг «открыть запись»: getFromIndex() (или getFromName()) читает содержимое записи напрямую и работает во всех современных версиях PHP.
Заключение
В этой статье мы рассмотрели функцию PHP zip_entry_open() и способы её применения для открытия файла в zip-архиве. Мы объяснили, что делает функция, разобрали её синтаксис и привели пример практического использования. Обратите внимание, что zip_entry_open() признана устаревшей и удалена в PHP 8.0; для современных проектов используйте класс ZipArchive, чтобы открывать и читать файлы в zip-архиве.