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