Получить значение из внутренней структуры, представляющей ресурс контекста

Я хочу проанализировать пакетный файл Git в PHP с помощью zlib. (Подробности по формату Вот а также Вот). Проблема, как упоминалось в этих статьях, заключается в том, что в упаковочном файле не указана длина для сжатых данных, а это означает, что вам нужно выбросить ее в zlib и использовать zlib, чтобы выяснить, где данные начинаются и останавливаются. В то время как родной C API zlib обеспечивает Z_STREAM_END константа, возвращаемая при достижении конца сжатых данных, расширение PHP zlib не предлагает такой опции. Мой единственный вариант, кажется, добавить один байт во входной поток за раз и проверить, total_in (часть потока zlib struct) равен 0, что, согласно исходному коду PHP и zlib, сбрасывается в ноль всякий раз, когда inflate() возвращается Z_STREAM_END, РЕДАКТИРОВАТЬ: PHP сбрасывает total_in значение, а не злиб. Это изменилось в запросе на получение ссылки, указанном в моем ответе ниже.

Проблема в том, как мне получить значение total_in? РНР inflate_init() Функция возвращает «ресурс контекста», который из моего прочтения исходного кода представляет struct zlib использует для распаковки.

Можно ли в чистом PHP получить значение total_in из внутреннего struct используя ресурс контекста?

Благодарю.

РЕДАКТИРОВАТЬ: По сути, я хочу иметь возможность использовать stream_context_get_options () в контексте zlib.inflate, но не могу, потому что получаю Invalid stream/context parameter,

0

Решение

После некоторых исследований, вот результаты (TL; DR: это невозможно без патча PHP):

  • Во-первых, ресурсы — это не просто структуры. Они могут представлять любую переменную C, зарегистрированную в Zend Engine. Некоторые свойства могут быть открыты для пользовательского пространства (код PHP) с такими вещами, как stream_context_get_params(), Однако это отдельно от фактического контента, который представляет ресурс.
    • Значения, которые представляют ресурсы, не доступны напрямую для пространства пользователя.
    • Я добавил несколько функций, чтобы раскрыть информацию, которую я хотел. Они ждут в этот php-src pull request.
0

Другие решения

Других решений пока нет …