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

Get value from internal struct representing a context resource

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

问题是,如何获取total_in的值? PHP 的 inflate_init() 函数 returns a "context resource" 从我对源代码的细读中代表 struct zlib 用于解压缩。

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

谢谢。

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

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

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