zip_entry_read()
Функция zip_entry_read() в PHP читала содержимое файла в zip-архиве. Удалена в PHP 8.0; используйте ZipArchive.
Функция zip_entry_read() была встроенной функцией PHP, предназначенной для чтения содержимого отдельного файла (записи) внутри открытого zip-архива — по одному блоку байт за раз. Она возвращала прочитанные данные в виде строки.
Важно: Вся процедурная семья zip_entry_* — включая zip_entry_read() — была объявлена устаревшей в PHP 7.4 и удалена в PHP 8.0. Прямой замены нет; вместо этого современный PHP читает записи zip через объектно-ориентированный класс ZipArchive. Эта страница документирует устаревшую функцию для справки, а затем демонстрирует подход с ZipArchive, который следует использовать сегодня. Для работы с zip-файлами необходимо, чтобы расширение zip было включено в вашей сборке PHP.
Синтаксис (устаревший)
string zip_entry_read(resource $zip_entry, int $length = 1024)| Параметр | Описание |
|---|---|
$zip_entry | Дескриптор записи, возвращённый функцией zip_entry_open() после того, как архив был открыт с помощью zip_open(), а запись получена через zip_read(). |
$length | Необязательный. Количество байт для чтения. Поскольку записи zip хранятся в сжатом виде, это количество несжатых байт, которые будут возвращены. По умолчанию 1024. |
Возвращаемое значение: прочитанное содержимое в виде строки или false при ошибке. Как и при чтении файла, повторные вызовы продвигаются по записи до её исчерпания.
Чтение записи zip с помощью ZipArchive (современный способ)
Наиболее чистой заменой является ZipArchive::getFromName(), которая возвращает всё распакованное содержимое записи по её имени файла — без ручного цикла открытия/чтения/закрытия для каждой записи.
Чтение одного файла из zip-архива в PHP
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$contents = $zip->getFromName('readme.txt');
$zip->close();
if ($contents !== false) {
echo $contents;
} else {
echo "Entry not found in archive.";
}
} else {
echo "Failed to open archive.";
}Здесь open() возвращает true при успехе (может также вернуть код ошибки, поэтому сравнивайте строго с === true). getFromName() распаковывает и возвращает всю запись за один вызов. Используйте getFromIndex($i) вместо этого, когда нужна запись по числовому индексу, а не по имени.
Перебор всех записей
Типичная задача — прочитать все файлы в архиве. numFiles возвращает количество записей, а statIndex() — метаданные каждой записи:
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$data = $zip->getFromIndex($i);
echo $name . " (" . strlen($data) . " bytes)\n";
}
$zip->close();
}Потоковое чтение больших записей
getFromName() загружает всю запись в память. Для большого файла откройте запись как поток и читайте её по частям — это настоящий современный аналог побайтового поведения zip_entry_read():
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$stream = $zip->getStream('big-log.txt');
if ($stream) {
while (!feof($stream)) {
$chunk = fread($stream, 8192); // read 8 KB at a time
echo $chunk;
}
fclose($stream);
}
$zip->close();
}Возвращённый поток является обычным потоковым ресурсом PHP, поэтому привычные функции fread() и feof() работают с ним напрямую.
Когда это может понадобиться?
- Чтение конфигурационных или шаблонных файлов, поставляемых внутри
.zip, без извлечения на диск. - Проверка загрузки (например, файлов
.docxили.xlsx, которые являются zip-контейнерами) запись за записью. - Обработка больших архивных журналов путём потоковой передачи вместо предварительной распаковки всего содержимого.
Если нужны байты только одного файла и неважно, что он находится в zip-архиве, извлечение его на диск с последующим использованием file_get_contents() также является допустимым вариантом.
Заключение
zip_entry_read() относилась к устаревшему процедурному API zip в PHP, который был объявлен устаревшим в 7.4 и удалён в 8.0. В любой поддерживаемой версии PHP читайте записи zip с помощью класса ZipArchive: используйте getFromName() / getFromIndex() для целых записей, выполняйте перебор с помощью numFiles и применяйте getStream() с fread(), когда запись слишком велика для хранения в памяти целиком.