Вопрос

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

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

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

Обновить: Я только что прочитал zlib FAQ:

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

Это было полезно?

Решение

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

  • gzencode() gzencode() использует формат файла GZIP, такой же, как gzip инструмент командной строки.Этот формат файла имеет заголовок, содержащий необязательные метаданные, данные DEFLATE compressed и нижний колонтитул, содержащий контрольную сумму CRC32 и проверку длины.
  • gzcompress() сжать () использует формат ZLIB.Он имеет более короткий заголовок, служащий только для определения формата сжатия, ВЫКАЧИВАНИЯ сжатых данных, и нижний колонтитул, содержащий контрольную сумму ADLER32.
  • gzdeflate() гздефлат() использует собственный алгоритм raw DEFLATE, который является основой для обоих других форматов.

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

При сжатии очень коротких строк накладные расходы каждого метода становятся релевантными, поскольку при очень коротком вводе накладные расходы могут составлять значительную часть выходных данных.Накладные расходы для каждого метода, измеряемые путем сжатия пустой строки, составляют:

  • gzencode('') = 20 байт
  • gzcompress('') = 8 байт
  • gzdeflate('') = 2 байта

Другие советы

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

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

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

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

Это все есть в RFC IETF 1950, 1951, и 1952.

Говорить, что "алгоритм gzip сжимает лучше, чем СДУВАЕТ", - это просто бессмыслица.Алгоритма gzip не существует.И алгоритм, используемый в формате GZIP является СДУВАЮЩИМСЯ.

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

Мне пришлось распаковать сжатый файл gzip на PHP с помощью C ++.Я узнал, что PHP gzencode и его аналог gzdecode используйте Z_NO_FLUSH метод и в конце блока данных, подлежащих кодированию/декодированию, применяет Z_FINISH.Пример / учебное пособие на C, показанное на веб-сайте zlib, можно использовать для распаковки и сжатия файлов gziped с PHP, при условии, что бит Windows и уровень памяти изменены, чтобы разрешить дефляции и раздувания gzip.

Дополнительный:Похоже, большинство людей в этой теме понятия не имеют, что означает "метод сжатия".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top