W3docs

zip_entry_compressionmethod()

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

Предупреждение: zip_entry_compressionmethod() была объявлена устаревшей в PHP 5.3.0 и удалена в PHP 8.0.0 (старый процедурный API zip_* для чтения архивов был упразднён). Она больше недоступна в современных версиях PHP. Эта страница сохранена в историческом архиве. В любой поддерживаемой версии PHP используйте класс ZipArchive, как показано ниже.

Функция zip_entry_compressionmethod() была встроенной функцией PHP, предназначенной для чтения метода сжатия отдельной записи (файла) внутри zip-архива. Метод сжатия — это алгоритм, использованный для хранения записи: чаще всего deflate (по умолчанию) или store (без сжатия).

На этой странице объясняется, что делала устаревшая функция, и, что важнее, как получить те же сведения в современном PHP с помощью ZipArchive.

Зачем знать метод сжатия

Каждый файл в zip-архиве хранит информацию о том, как он был сжат. Знание метода позволяет:

  • Проверить архив — убедиться, действительно ли файлы сжаты или просто сохранены.
  • Оценить нагрузку — записи store распаковываются мгновенно; записи deflate требуют ресурсов процессора.
  • Диагностировать проблемы с размером — уже сжатые данные (JPEG, PNG, MP4) часто хранятся без повторного сжатия, поскольку повторное применение deflate не даёт выигрыша.

На практике встречаются два метода:

КонстантаКодЗначение
ZipArchive::CM_STORE0Запись хранится без сжатия.
ZipArchive::CM_DEFLATE8Запись сжата алгоритмом deflate (по умолчанию).

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

Оригинальная функция принимала дескриптор zip-записи, возвращаемый функцией zip_read():

int zip_entry_compressionmethod(resource $zip_entry)

Где $zip_entry — ресурс zip-записи для файла в архиве. Функция требовала устаревшего процедурного API zip и больше не существует, поэтому не используйте её в новом коде.

Современный подход с ZipArchive

Переносимый, безопасный по версии способ чтения метода сжатия — ZipArchive::statIndex(). Он возвращает массив, в котором ключ comp_method содержит числовой код метода (0 — store, 8 — deflate). Следующий пример полностью самодостаточен: он создаёт небольшой архив, а затем выводит метод для каждой записи:

<?php
$file = sys_get_temp_dir() . '/example.zip';

// 1. Build a zip with one compressed and one stored entry.
$zip = new ZipArchive();
if ($zip->open($file, ZipArchive::CREATE | ZipArchive::OVERWRITE) === true) {
    $zip->addFromString('report.txt', str_repeat('compress me ', 100));
    $zip->addFromString('raw.txt', 'left as-is');
    $zip->setCompressionName('raw.txt', ZipArchive::CM_STORE); // force no compression
    $zip->close();
}

// 2. Reopen and read each entry's compression method.
$labels = [
    ZipArchive::CM_STORE   => 'stored (no compression)',
    ZipArchive::CM_DEFLATE => 'deflate',
];

$zip = new ZipArchive();
if ($zip->open($file) === true) {
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $stat   = $zip->statIndex($i);
        $code   = $stat['comp_method'];
        $method = $labels[$code] ?? "unknown ($code)";
        echo "{$stat['name']} => {$method}\n";
    }
    $zip->close();
}

Вывод:

report.txt => deflate
raw.txt => stored (no compression)

statIndex() читает данные из центрального каталога архива, поэтому операция недорогая — файл не распаковывается.

Краткая альтернатива: getCompressionName()

Если ваш PHP скомпилирован с libzip 1.0 или новее, ZipArchive::getCompressionName() возвращает название метода сжатия в виде строки напрямую:

$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
    // Name of the compression method used for the first entry.
    echo $zip->getCompressionName(0); // e.g. "deflate"
    $zip->close();
}

Это читается нагляднее, однако getCompressionName() присутствует не во всех сборках. Для обеспечения переносимости между серверами предпочтительнее использовать подход с statIndex().

Заключение

zip_entry_compressionmethod() относилась к удалённому процедурному zip API PHP и не должна применяться в новом коде. Для чтения метода сжатия zip-записи в современном PHP используйте ZipArchive::statIndex() и проверяйте значение comp_method (0 = store, 8 = deflate), либо getCompressionName() там, где она доступна.

Для дальнейшей работы с zip-архивами смотрите Работу с расширением Zip, zip_entry_name() для получения имени записи и zip_entry_compressedsize() для её сжатого размера.

Практика

Практика
Что делает функция zip_entry_compressionmethod() в PHP?
Что делает функция zip_entry_compressionmethod() в PHP?
Was this page helpful?