Zip entry compressionmethod: примеры (PHP)

Определение метода сжатия в ZIP архивах через PHP
Раздел: Архивация
zip_entry_compressionmethod(resource zip_entry): string

Функция zip_entry_compressionmethod

Описание и назначение

Функция zip_entry_compressionmethod() является частью старого (legacy) расширения Zip в PHP, которое работает с архивами Zip. Ее основное назначение - получение метода сжатия для конкретного элемента (файла или директории) внутри открытого архива Zip. Функция применяется при последовательном чтении архива с использованием функций zip_open(), zip_read() и других.

Аргументы функции

Функция принимает один обязательный параметр:
zip_entry (resource) - дескриптор элемента архива, полученный с помощью функции zip_read(). Этот ресурс указывает на конкретную запись внутри открытого ZIP-архива.

Возвращаемое значение

Функция возвращает целое число, соответствующее методу сжатия:
0 - означает сжатие STORED (без сжатия).
8 - означает сжатие DEFLATED (стандартный метод сжатия).
12 - означает сжатие BZIP2 (если поддержка была скомпилирована).
14 - означает сжатие LZMA.
В случае неудачи функция возвращает false.

Примеры использования

Базовый пример чтения архива

Код проверяет метод сжатия для каждого элемента в архиве.

$zip = zip_open('archive.zip');
if ($zip) {
    while ($zip_entry = zip_read($zip)) {
        $method_code = zip_entry_compressionmethod($zip_entry);
        $name = zip_entry_name($zip_entry);
        echo "Файл: $name - Метод сжатия: ";
        switch($method_code) {
            case 0: echo "STORED (без сжатия)"; break;
            case 8: echo "DEFLATED"; break;
            case 12: echo "BZIP2"; break;
            case 14: echo "LZMA"; break;
            default: echo "Неизвестный ($method_code)";
        }
        echo "\n";
    }
    zip_close($zip);
}
Файл: document.txt - Метод сжатия: DEFLATED
Файл: image.png - Метод сжатия: STORED (без сжатия)
Файл: data.csv - Метод сжатия: DEFLATED

Похожие функции в PHP

Класс ZipArchive

Современной и предпочтительной альтернативой является класс ZipArchive. Он предоставляет объектно-ориентированный интерфейс и больше возможностей.

$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
    $method = $zip->statIndex(0)['comp_method'];
    echo "Метод сжатия первого файла: ".ZipArchive::CM_DEFLATE;
    $zip->close();
}
Отличия и рекомендации

Функции на основе ресурсов (zip_entry_*) считаются устаревшими. Класс ZipArchive появился в PHP 5.2 и является стандартом для новой разработки. Он поддерживает больше форматов сжатия, методы шифрования и предоставляет лучшую обработку ошибок.

Альтернативы в других языках

Python (модуль zipfile)

В Python для работы с ZIP используется модуль zipfile. Атрибут compress_type объекта ZipInfo аналогичен функции PHP.

import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zf:
    for info in zf.infolist():
        print(f"{info.filename}: {info.compress_type}")
document.txt: 8
image.png: 0
JavaScript (библиотека JSZip)

В браузерном JavaScript часто используется библиотека JSZip. Метод сжатия доступен через свойство объекта файла.

// JSZip загружает архив асинхронно
JSZip.loadAsync(zipData)
  .then(function(zip) {
    zip.forEach(function (relativePath, zipEntry) {
      console.log(zipEntry.name, zipEntry.options.compression);
    });
  });

Zip entry compressionmethod в MySQL

MySQL не имеет встроенных функций для детального анализа ZIP-архивов. Работа с архивами обычно происходит на уровне приложения.

Типичные ошибки

Передача некорректного ресурса

Ошибка возникает, если передать не ресурс или ресурс, не являющийся записью ZIP.

$fp = fopen('file.txt', 'r');
$result = zip_entry_compressionmethod($fp); // Неверный ресурс
var_dump($result);
bool(false)
Использование после закрытия архива

Ресурс записи становится недействительным после закрытия архива.

$zip = zip_open('archive.zip');
$entry = zip_read($zip);
zip_close($zip);
// Попытка использования после zip_close
$method = zip_entry_compressionmethod($entry);
var_dump($method);
Warning: zip_entry_compressionmethod(): supplied resource is not a valid Zip Entry resource
bool(false)
Отсутствие файла или прав доступа

Функция не может получить информацию, если архив поврежден или отсутствует.

$zip = zip_open('nonexistent.zip');
if (is_resource($zip)) {
    // Этот блок может не выполниться
} else {
    echo "Не удалось открыть архив";
}

Изменения в версиях PHP

Функция zip_entry_compressionmethod() была частью модуля Zip, который не является частью ядра PHP и требует отдельной компиляции. В последних версиях PHP (8.x) значительных изменений в поведении этой конкретной функции не было. Однако, важно отметить, что весь старый процедурный API (zip_open, zip_read, zip_entry_*) считается устаревшим по сравнению с объектно-ориентированным API ZipArchive. В документации PHP рекомендуется использовать ZipArchive для новой разработки.

Расширенные примеры

Анализ эффективности сжатия

Пример вычисляет степень сжатия для каждого файла в архиве.

Пример php
$zip = zip_open('archive.zip');
if ($zip) {
    echo "<table border='1'><tr><th>Файл</th><th>Метод</th><th>Размер сжат.</th><th>Размер исходн.</th><th>Коэфф.</th></tr>";
    while ($zip_entry = zip_read($zip)) {
        $name = zip_entry_name($zip_entry);
        $method = zip_entry_compressionmethod($zip_entry);
        $compressed_size = zip_entry_compressedsize($zip_entry);
        $size = zip_entry_filesize($zip_entry);
        $ratio = ($size > 0) ? round(($compressed_size / $size) * 100, 1) : 0;
        $method_name = ($method == 8) ? 'DEFLATED' : (($method == 0) ? 'STORED' : 'Другой');
        echo "<tr><td>$name</td><td>$method_name</td><td>$compressed_size</td><td>$size</td><td>$ratio%</td></tr>";
    }
    echo "</table>";
    zip_close($zip);
}
Фильтрация по методу сжатия

Код извлекает только файлы, сжатые методом DEFLATE.

Пример php
$zip = zip_open('archive.zip');
if ($zip) {
    $extract_dir = './extracted/';
    if (!is_dir($extract_dir)) mkdir($extract_dir);
    while ($zip_entry = zip_read($zip)) {
        if (zip_entry_compressionmethod($zip_entry) == 8) { // DEFLATED
            $name = zip_entry_name($zip_entry);
            if (zip_entry_open($zip, $zip_entry, 'r')) {
                $content = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
                file_put_contents($extract_dir . basename($name), $content);
                zip_entry_close($zip_entry);
                echo "Извлечен DEFLATED файл: $name\n";
            }
        }
    }
    zip_close($zip);
}

PHP zip_entry_compressionmethod function comments

En
Zip entry compressionmethod Retrieve the compression method of a directory entry