Какой метод сжатия использовать в PHP?
У меня есть большой объем данных для перемещения с использованием двух PHP-скриптов: один на стороне клиента с использованием командной строки PHP script и других за Apache. Я отправляю данные на сервер и использую поток ввода php://, чтобы сохранить его на веб-сервере. Чтобы не доходить до пределов памяти, данные разделяются на куски 500 кБ для каждого запроса POST. Все это прекрасно работает.
Теперь, чтобы сохранить полосу пропускания и ускорить ее, я хочу сжать данные перед отправкой и распаковкой, когда они получены на другом конце. Я нашел 3 пары функций, которые могут выполнять эту работу, но я не могу решить, какой из них использовать:
Какую пару функций вы бы порекомендовали и почему?
ОБНОВЛЕНИЕ: Я только что прочитал zlib FAQ:
Формат gzip (gzencode
) был разработан, чтобы сохранить информацию о каталоге одного файла, например имя и дату последнего изменения. Формат zlib (gzcompress
), с другой стороны, был разработан для приложений в памяти и каналах связи и имеет гораздо более компактный заголовок и трейлер и использует более быструю проверку целостности, чем gzip.
Ответы
Ответ 1
Все это можно использовать. Существуют тонкие различия между тремя:
- gzencode() использует формат файла GZIP, такой же, как инструмент командной строки
gzip
. Этот формат файла содержит заголовок, содержащий дополнительные метаданные, сжатые данные DEFLATE и нижний колонтитул, содержащие контрольную сумму CRC32 и проверку длины.
- gzcompress() использует формат ZLIB. Он имеет более короткий заголовок, служащий только для определения формата сжатия, сжатых данных DEFLATE и нижнего колонтитула, содержащего контрольную сумму ADLER32.
- gzdeflate() использует собственный алгоритм DEFLATE самостоятельно, что является основой для обоих форматы.
Все три используют один и тот же алгоритм под капотом. gzencode()
добавляет возможность включать исходное имя файла и другие данные об окружающей среде (это не используется при сжатии строки). gzencode()
и gzcompress()
оба добавляют контрольную сумму, поэтому можно проверить целостность архива, что может быть полезно для ненадежных методов передачи и хранения. Если все хранится локально, и вам не нужны дополнительные метаданные, тогда gzdeflate()
будет достаточно. Для переносимости я бы рекомендовал gzencode()
(формат GZIP), который, вероятно, лучше поддерживается, чем gzcompress()
(формат ZLIB) среди других инструментов.
Ответ 2
Я не эксперт по PHP и не могу ответить на поставленный вопрос, но похоже, что здесь много угадывания, и предлагается нечеткая информация.
DEFLATE - это имя алгоритма сжатия, который используется ZLIB, GZIP и другими. Теоретически GZIP поддерживает альтернативные алгоритмы сжатия, но на практике их нет.
Нет такой вещи, как "алгоритм GZIP". GZIP использует алгоритм DEFLATE и помещает данные кадрирования вокруг сжатых данных. С GZIP вы можете добавлять такие вещи, как имя файла, время файла, CRC, даже комментарий. Однако эти метаданные являются необязательными, и многие gzippers просто опускают его.
ZLIB аналогичен, за исключением другого, более ограниченного набора метаданных и определенного 2-байтового заголовка.
Это все в RFC-каналах IETF 1950, 1951 и 1952.
Сказать, что "алгоритм gzip сжимается лучше, чем DEFLATE" - это просто абсурд. Не существует алгоритма gzip. А алгоритм, используемый в формате GZIP , - DEFLATE.
Ответ 3
Все методы по существу одинаковы, разница между ними в основном заключается в заголовках. лично я бы использовал gzencode, это будет выдавать вывод, который равен вызову командной строки в утилиту gzip.