Я хочу проанализировать пакетный файл Git в PHP с помощью zlib. (Подробности по формату Вот а также Вот). Проблема, как упоминалось в этих статьях, заключается в том, что в упаковочном файле не указана длина для сжатых данных, а это означает, что вам нужно выбросить ее в zlib и использовать zlib, чтобы выяснить, где данные начинаются и останавливаются. В то время как родной C API zlib обеспечивает Z_STREAM_END
константа, возвращаемая при достижении конца сжатых данных, расширение PHP zlib не предлагает такой опции. Мой единственный вариант, кажется, добавить один байт во входной поток за раз и проверить, РЕДАКТИРОВАТЬ: PHP сбрасывает total_in
(часть потока zlib struct
) равен 0, что, согласно исходному коду PHP и zlib, сбрасывается в ноль всякий раз, когда inflate()
возвращается Z_STREAM_END
,total_in
значение, а не злиб. Это изменилось в запросе на получение ссылки, указанном в моем ответе ниже.
Проблема в том, как мне получить значение total_in
? РНР inflate_init()
Функция возвращает «ресурс контекста», который из моего прочтения исходного кода представляет struct
zlib использует для распаковки.
Можно ли в чистом PHP получить значение total_in
из внутреннего struct
используя ресурс контекста?
Благодарю.
РЕДАКТИРОВАТЬ: По сути, я хочу иметь возможность использовать stream_context_get_options () в контексте zlib.inflate, но не могу, потому что получаю Invalid stream/context parameter
,
После некоторых исследований, вот результаты (TL; DR: это невозможно без патча PHP):
stream_context_get_params()
, Однако это отдельно от фактического контента, который представляет ресурс.
Других решений пока нет …