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
$compressed_gzip = gzdeflate($data, -1, ZLIB_ENCODING_GZIP);
echo 'GZIP кодирование: ' . strlen($compressed_gzip);GZIP кодирование: 55
Альтернативные функции сжатия в PHP
PHP предлагает несколько функций для работы со сжатием данных:
Создает строку в формате gzip, включая заголовки. Подходит для создания файлов .gz.
Использует формат zlib с заголовком и контрольной суммой. Результат совместим с функцией gzuncompress().
Доступна при наличии модуля brotli. Обеспечивает лучшее сжатие чем DEFLATE, но требует больше ресурсов.
gzdeflate() предпочтительнее при работе с сырыми данными DEFLATE без дополнительных заголовков.
Аналоги в других языках программирования
import zlib
data = b'Example string for compression'
compressed = zlib.compress(data, level=6)
print(len(compressed))35
const pako = require('pako');
const data = 'Example string for compression';
const compressed = pako.deflate(data);
console.log(compressed.length);35
SELECT LENGTH(COMPRESS('Example string for compression'));35
Основное отличие PHP функции - поддержка различных уровней сжатия и кодирований через параметры.
Распространенные ошибки
// При отключенном расширении 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 7
$compressed = @gzdeflate('', 10);
var_dump($compressed);
// В PHP 8
$compressed = gzdeflate('', 10);
var_dump($compressed);PHP 7: bool(false) с предупреждением
PHP 8: bool(false) без предупреждения
Расширенные примеры применения
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%
$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 )
)
$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 байт
// Сохранение сжатых данных в БД
$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 ? 'Да' : 'Нет');Данные идентичны: Да