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


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

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

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

обновление: я только что прочитал zlib Часто задаваемые вопросы:

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

3 57

3 ответа:

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

  • gzencode() использует формат файла GZIP, такой же, как и gzip инструмент командной строки. Этот формат файла имеет заголовок, содержащий необязательные метаданные, сдувание сжатых данных и нижний колонтитул, содержащий контрольную сумму 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-байтового заголовка.

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

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

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