W3docs

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(), когда запись слишком велика для хранения в памяти целиком.

Практика

Практика
В PHP 8.0+, какой способ правильного чтения содержимого одного файла из открытого ZipArchive?
В PHP 8.0+, какой способ правильного чтения содержимого одного файла из открытого ZipArchive?
Was this page helpful?