我正在开发一个为现有 Web 工具解析数据文件的包装器。但是,我正在使用大型数据文件,因此我无法将整个内容加载到内存中,因此我必须逐步将其加载到小块中。现有的 Web 工具需要类似于 SimpleXML 样式的数据($obj->parentnode->childnode->childnode 返回字符串或某种类型的节点对象)。值得庆幸的是,其结构类似于 XML,但语法很奇怪。由于情有可原,我不能把它翻译成一种理智的格式。所以我必须即时模仿它。
当我浏览文件时,我不需要解析整个树,只需解析当前节点的子节点名称。每个子节点名称和关联的偏移量都将存储在父节点中。如果需要访问子节点的内容,则将克隆父节点对象,更新偏移值,并且子节点对象将开始解析其内容,直到找到请求的子节点。
我的问题是:
- 克隆父节点对象将为子克隆提供文件句柄。如果需要,是否所有克隆都使用相同的句柄并使用 fseek 来跳转文件(这是一个很大的如果)?
- 我需要关闭文件吗?或者脚本执行结束时的垃圾收集会关闭它吗?如果我不这样做,我会面临什么危险?
- 我需要为每个克隆创建句柄,还是应该坚持让它们共享一个?如果有,有上限吗?
- 克隆对象有没有办法保存对原始对象的引用?如果我将句柄关闭在对象析构函数中,如果对象是克隆,我可能不应该关闭它。并且能够向上追踪可能会派上用场。