从表示上下文资源的内部结构获取值

时间:2016-11-18 22:19:17

标签: php struct zlib

我想用zlib解析PHP中的Git包文件。 (有关格式herehere)的详细信息。正如那些文章中提到的那样,问题是packfile中没有为压缩数据指定长度,这意味着你必须将它扔进zlib并使用zlib来确定数据的开始和停止位置。虽然zlib的本机C API提供了在达到压缩数据末尾时返回的Z_STREAM_END常量,但PHP的zlib扩展不提供此类选项。 我唯一的选择似乎是一次向输入流添加一个字节并检查total_in(zlib流struct的一部分)是否为0,根据PHP和只要inflate()返回Z_STREAM_END,zlib源代码就会重置为零。 编辑:PHP重置total_in值,而不是zlib。这在我在下面的回答中链接的拉取请求中已更改。

问题是,如何获得total_in的值? PHP的inflate_init()函数返回一个“上下文资源”,我仔细阅读源代码表示struct zlib用于解压缩。

在纯PHP中,是否可以使用上下文资源从内部total_in获取struct的值?

感谢。

编辑:基本上,我希望能够在zlib.inflate上下文中使用stream_context_get_options(),但我不能,因为我得到Invalid stream/context parameter

1 个答案:

答案 0 :(得分:0)

经过一番研究,结果如下(TL; DR:没有PHP补丁,这是不可能的。):

  • 首先,资源不仅仅是结构。它们可以表示使用Zend Engine注册的任何C变量。某些属性可能会使用stream_context_get_params()之类的内容暴露给用户空间(PHP代码)。但是,这与资源所代表的实际内容是分开的。
    • 值资源表示不能直接供用户空间使用。
    • 我添加了一些函数来公开我想要的信息。他们正在等待this php-src拉取请求。