Какой метод сжатия использовать в PHP?

У меня есть большой объем данных для перемещения, используя два сценария PHP: один на стороне клиента, используя скрипт PHP командной строки и другие за Apache. Я отправляю данные на сервер и использую поток ввода php: //, чтобы сохранить его на веб-сервере. Чтобы не доходить до пределов памяти, данные разделяются на куски 500 кБ для каждого запроса POST. Все это прекрасно работает.

Теперь, чтобы сохранить полосу пропускания и ускорить ее, я хочу сжать данные перед отправкой и распаковкой, когда они получены на другом конце. Я нашел 3 пары функций, которые могут выполнять эту работу, но я не могу решить, какой из них использовать:

  • gzencode / gzdecode
  • gzdeflate / gzinflate
  • gzcompress / gzuncompress

Какую пару функций вы бы порекомендовали и почему?

ОБНОВЛЕНИЕ: Я только что прочитал zlib FAQ:

Формат gzip ( gzencode ) был разработан, чтобы сохранить информацию о каталоге одного файла, например имя и дату последней модификации. С другой стороны, формат zlib ( gzcompress ) был разработан для приложений в памяти и коммуникационных каналах и имеет гораздо более компактный заголовок и трейлер и использует более быструю проверку целостности, чем gzip.

Все это можно использовать. Существуют тонкие различия между тремя:

  • gzencode () использует формат файла GZIP, то же самое, что и инструмент командной строки gzip . Этот формат файла содержит заголовок, содержащий дополнительные метаданные, сжатые данные DEFLATE и нижний колонтитул, содержащий контрольную сумму CRC32 и проверку длины.
  • gzcompress () использует формат ZLIB. Он имеет более короткий заголовок, служащий только для идентификации формата сжатия, сжатых данных DEFLATE и нижнего колонтитула, содержащего контрольную сумму ADLER32.
  • gzdeflate () использует собственный алгоритм DEFLATE самостоятельно, что является основой для обоих других форматов.

Все три используют один и тот же алгоритм под капотом. gzencode() добавляет возможность включать исходное имя файла и другие данные об окружающей среде (это не используется при сжатии строки). gzencode() и gzcompress() добавляют контрольную сумму, поэтому можно проверить целостность архива, что может быть полезно для ненадежных методов передачи и хранения. Если все хранится локально и вам не нужны дополнительные метаданные, тогда gzdeflate() будет достаточно. Для переносимости я бы рекомендовал gzencode() (формат GZIP), который, вероятно, лучше поддерживается, чем gzcompress() (формат ZLIB) среди других инструментов.

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

DEFLATE – это имя алгоритма сжатия, который используется ZLIB, GZIP и другими. Теоретически GZIP поддерживает альтернативные алгоритмы сжатия, но на практике их нет.

Не существует такого понятия, как «алгоритм GZIP». GZIP использует алгоритм DEFLATE и помещает данные кадрирования вокруг сжатых данных. С GZIP вы можете добавлять такие вещи, как имя файла, время файла, CRC, даже комментарий. Однако эти метаданные являются необязательными, и многие gzippers просто опускают его.

ZLIB аналогичен, за исключением другого, более ограниченного набора метаданных и определенного 2-байтового заголовка.

Это все в IETF RFC 1950 , 1951 и 1952 годах .

Сказать, что «алгоритм gzip сжимается лучше, чем DEFLATE» – это просто абсурд. Не существует алгоритма gzip. И алгоритм, используемый в формате GZIP, – DEFLATE .

Все методы по существу одинаковы, разница между ними в основном заключается в заголовках. лично я бы использовал gzencode, это приведет к выдаче вывода, равного вызову командной строки в утилиту gzip.