У меня есть большой объем данных для перемещения, используя два сценария PHP: один на стороне клиента, используя скрипт PHP командной строки и другие за Apache. Я отправляю данные на сервер и использую поток ввода php: //, чтобы сохранить его на веб-сервере. Чтобы не доходить до пределов памяти, данные разделяются на куски 500 кБ для каждого запроса POST. Все это прекрасно работает.
Теперь, чтобы сохранить полосу пропускания и ускорить ее, я хочу сжать данные перед отправкой и распаковкой, когда они получены на другом конце. Я нашел 3 пары функций, которые могут выполнять эту работу, но я не могу решить, какой из них использовать:
gzencode
/ gzdecode
gzdeflate
/ gzinflate
gzcompress
/ gzuncompress
Какую пару функций вы бы порекомендовали и почему?
ОБНОВЛЕНИЕ: Я только что прочитал zlib FAQ:
Формат gzip ( gzencode
) был разработан, чтобы сохранить информацию о каталоге одного файла, например имя и дату последней модификации. С другой стороны, формат zlib ( gzcompress
) был разработан для приложений в памяти и коммуникационных каналах и имеет гораздо более компактный заголовок и трейлер и использует более быструю проверку целостности, чем gzip.
Все это можно использовать. Существуют тонкие различия между тремя:
gzip
. Этот формат файла содержит заголовок, содержащий дополнительные метаданные, сжатые данные DEFLATE и нижний колонтитул, содержащий контрольную сумму CRC32 и проверку длины. Все три используют один и тот же алгоритм под капотом. 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.