W3docs

zip_entry_filesize()

Функция zip_entry_filesize() в PHP возвращала несжатый размер файла в zip-архиве. Устарела в PHP 8.0 и удалена в PHP 8.1.

Функция zip_entry_filesize() была встроенной функцией PHP, которая возвращала несжатый (оригинальный) размер в байтах одного файла внутри zip-архива. Она работала совместно со старым процедурным zip API (zip_open(), zip_read() и zip_entry_open()).

Внимание

zip_entry_filesize() была объявлена устаревшей в PHP 8.0 и удалена в PHP 8.1. В современных версиях PHP она не существует. В новом коде следует использовать класс ZipArchive — на этой странице показан эквивалентный поддерживаемый подход.

Что означает «несжатый размер»

Zip-архив хранит для каждой записи два размера:

  • Несжатый размер — каков размер файла после извлечения (то, что сообщала zip_entry_filesize() и что ZipArchive::statName() предоставляет как size).
  • Сжатый размер — сколько байт запись фактически занимает внутри архива после сжатия. В процедурном API это была zip_entry_compressedsize(); в ZipArchive это поле comp_size.

Знание несжатого размера заранее полезно для отображения размеров загрузки пользователям, проверки наличия достаточного места на диске для распаковки или валидации загружаемого файла перед его распаковкой.

Устаревший синтаксис

Для справки, оригинальная сигнатура была:

int zip_entry_filesize(resource $zip_entry)

Где $zip_entry — дескриптор zip-записи, возвращаемый функцией zip_read(). Функция возвращала несжатый размер записи в байтах. Поскольку функция больше не существует, не используйте её в новом коде.

Современная замена: ZipArchive::statName()

Поддерживаемый способ получить несжатый размер записи — ZipArchive::statName(), которая возвращает ассоциативный массив метаданных (или false, если запись отсутствует). Ключ size содержит несжатый размер.

$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
    $stat = $zip->statName('file.txt');
    if ($stat !== false) {
        echo "The uncompressed size of the file is: " . $stat['size'] . " bytes.";
    } else {
        echo "File not found in archive.";
    }
    $zip->close();
} else {
    echo "Failed to open archive.";
}

statName() ищет запись по её пути внутри архива. Если у вас есть только индекс (например, при переборе с помощью numFiles), используйте вместо неё statIndex() — она возвращает массив той же структуры.

Сравнение сжатого и несжатого размера

Поскольку массив stat содержит оба числа, можно вывести степень сжатия за один проход — без отдельных вызовов, как в паре zip_entry_filesize() / zip_entry_compressedsize():

$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat = $zip->statIndex($i);
        $saved = $stat['size'] > 0
            ? round(100 * (1 - $stat['comp_size'] / $stat['size']))
            : 0;
        echo "{$stat['name']}: {$stat['size']} bytes -> {$stat['comp_size']} bytes ({$saved}% saved)\n";
    }
    $zip->close();
} else {
    echo "Failed to open archive.";
}

Распространённые ошибки

  • Проверяйте возвращаемое значение. open() возвращает true при успехе или код ошибки (целое число) при неудаче, поэтому сравнивайте с === true, а не нестрогой проверкой на истинность. statName() возвращает false при отсутствующей записи.
  • size — это несжатое значение. Распространённая ошибка — считать, что это размер на диске внутри zip-файла; это comp_size.
  • Директории тоже являются записями. При переборе с помощью statIndex() записи директорий появляются с завершающим символом / и size равным 0.

Заключение

zip_entry_filesize() была удалена в PHP 8.1, поэтому не должна использоваться в новом коде. Её задачу — считывание несжатого размера записи — теперь выполняет ZipArchive::statName() (или statIndex()), чьё поле size возвращает то же значение, также предоставляя comp_size для сжатого размера. Смотрите обзор ZipArchive и filesize() для связанных вспомогательных функций работы с размером файлов.

Практика

Практика
Какова роль функции zip_entry_filesize() в PHP?
Какова роль функции zip_entry_filesize() в PHP?
Was this page helpful?