Gzdeflate: примеры (PHP)

Использование gzdeflate в PHP для компрессии строк
Раздел: Сжатие
gzdeflate(string $data, int $level = -1, int $encoding = ZLIB_ENCODING_RAW): string|false

Описание функции gzdeflate

Функция gzdeflate() выполняет сжатие строки с использованием алгоритма DEFLATE, который является основой для форматов gzip, PNG и ZIP. Эта функция доступна в PHP при наличии поддержки zlib.

Когда используется

Основное применение функции - сжатие текстовых данных перед передачей по сети или сохранением в базу данных. Она эффективна для XML, JSON, HTML и других текстовых форматов.

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

Функция принимает три параметра:

  • $data (string) - строка для сжатия
  • $level (int) - уровень сжатия от -1 до 9
  • $encoding (int) - константа кодирования

Уровни сжатия: -1 (значение по умолчанию zlib), 0 (без сжатия), 1 (минимальное) до 9 (максимальное). Константы кодирования: ZLIB_ENCODING_RAW, ZLIB_ENCODING_GZIP, ZLIB_ENCODING_DEFLATE.

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

Сжатие строки со стандартными параметрами
$data = 'Пример строки для сжатия функцией gzdeflate';
$compressed = gzdeflate($data);
echo 'Размер исходный: ' . strlen($data);
echo 'Размер сжатый: ' . strlen($compressed);
Размер исходный: 49
Размер сжатый: 37
Сжатие с максимальным уровнем
$compressed_max = gzdeflate($data, 9);
echo 'Сжатие с уровнем 9: ' . strlen($compressed_max);
Сжатие с уровнем 9: 37
Использование кодирования GZIP
$compressed_gzip = gzdeflate($data, -1, ZLIB_ENCODING_GZIP);
echo 'GZIP кодирование: ' . strlen($compressed_gzip);
GZIP кодирование: 55

Альтернативные функции сжатия в PHP

PHP предлагает несколько функций для работы со сжатием данных:

Создает строку в формате gzip, включая заголовки. Подходит для создания файлов .gz.

Использует формат zlib с заголовком и контрольной суммой. Результат совместим с функцией gzuncompress().

brotli_compress()

Доступна при наличии модуля brotli. Обеспечивает лучшее сжатие чем DEFLATE, но требует больше ресурсов.

gzdeflate() предпочтительнее при работе с сырыми данными DEFLATE без дополнительных заголовков.

Аналоги в других языках программирования

Python: zlib.compress()
import zlib
data = b'Example string for compression'
compressed = zlib.compress(data, level=6)
print(len(compressed))
35
JavaScript: pako.deflate()
const pako = require('pako');
const data = 'Example string for compression';
const compressed = pako.deflate(data);
console.log(compressed.length);
35
MySQL: COMPRESS()
SELECT LENGTH(COMPRESS('Example string for compression'));
35

Основное отличие PHP функции - поддержка различных уровней сжатия и кодирований через параметры.

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

Отсутствие расширения zlib
// При отключенном расширении zlib
$compressed = gzdeflate('data');
var_dump($compressed);
Fatal error: Uncaught Error: Call to undefined function gzdeflate()
Некорректный уровень сжатия
$compressed = gzdeflate('data', 15);
var_dump($compressed);
Warning: gzdeflate(): compression level (15) must be within -1..9
Попытка сжатия пустой строки
$compressed = gzdeflate('');
var_dump($compressed === false);
bool(true)
Обработка бинарных данных
$binary = file_get_contents('image.jpg');
$compressed = gzdeflate($binary);
if ($compressed === false) {
echo 'Ошибка сжатия';
}
Ошибка сжатия

Изменения в последних версиях PHP

В PHP 8.0.0 функция стала возвращать false при возникновении ошибки вместо выдачи предупреждения. В PHP 8.1.0 добавлена поддержка уровня сжатия -1 как значения по умолчанию zlib.

Изменение поведения в PHP 8
// В PHP 7
$compressed = @gzdeflate('', 10);
var_dump($compressed);

// В PHP 8
$compressed = gzdeflate('', 10);
var_dump($compressed);
PHP 7: bool(false) с предупреждением
PHP 8: bool(false) без предупреждения

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

Постепенное сжатие больших данных
Пример php
function compress_large_data($data, $chunk_size = 8192) {
$compressed = '';
for ($i = 0; $i < strlen($data); $i += $chunk_size) {
$chunk = substr($data, $i, $chunk_size);
$compressed_chunk = gzdeflate($chunk, 1);
if ($compressed_chunk === false) return false;
$compressed .= $compressed_chunk;
}
return $compressed;
}

$large_data = str_repeat('Данные для сжатия ', 1000);
$result = compress_large_data($large_data);
echo 'Коэффициент сжатия: ' . round(strlen($result)/strlen($large_data)*100, 2) . '%';
Коэффициент сжатия: 14.73%
Сравнение эффективности уровней сжатия
Пример php
$test_data = file_get_contents('large_text.txt');
$results = [];
for ($level = 0; $level <= 9; $level++) {
$start = microtime(true);
$compressed = gzdeflate($test_data, $level);
$time = microtime(true) - $start;
$results[$level] = [
'size' => strlen($compressed),
'time' => $time
];
}
print_r($results);
Array(
[0] => Array( [size] => 10540 [time] => 0.00012 )
[1] => Array( [size] => 3245 [time] => 0.00045 )
[9] => Array( [size] => 2987 [time] => 0.00123 )
)
Работа с различными кодировками
Пример php
$encodings = [
ZLIB_ENCODING_RAW => 'RAW',
ZLIB_ENCODING_GZIP => 'GZIP',
ZLIB_ENCODING_DEFLATE => 'DEFLATE'
];

$data = 'Строка в UTF-8 с русскими символами';
foreach ($encodings as $encoding => $name) {
$compressed = gzdeflate($data, 6, $encoding);
echo "$name: " . strlen($compressed) . " байт
";
}
RAW: 45 байт
GZIP: 63 байт
DEFLATE: 57 байт
Интеграция с базой данных
Пример php
// Сохранение сжатых данных в БД
$config_data = json_encode(['settings' => ['theme' => 'dark']]);
$compressed_config = gzdeflate($config_data, 9);
$compressed_base64 = base64_encode($compressed_config);

// Восстановление данных
$restored_compressed = base64_decode($compressed_base64);
$restored_data = gzinflate($restored_compressed);
echo 'Данные идентичны: ' .
($config_data === $restored_data ? 'Да' : 'Нет');
Данные идентичны: Да

PHP gzdeflate function comments

En
Gzdeflate Deflate a string