【问题标题】:Does CachingIterator cache incrementally?CachingIterator 是否增量缓存?
【发布时间】:2020-08-23 01:54:11
【问题描述】:

我想缓存列表中的内容,实际上只有必须被检索一次。列表中的项目是从文件列表中检索的可调用项,并且对这些文件的访问权限不得超过一次。如果再次访问该文件,则会破坏软件。

我想为此使用CachingIterator。但是,我不确定它究竟是如何缓存项目的。我要从中缓存项目的列表可能会迭代多次,迭代次数不同。虽然我需要按键缓存项目,但如果另一个进程的迭代次数超过之前的迭代次数,我还需要将它们添加到缓存中。

那么,CachingIterator 支持吗?或者它会缓存第一次迭代产生的列表,并且不再继续吗?或者它只是迭代整个列表,这违背了在数组上使用迭代器的意义?

【问题讨论】:

    标签: php caching iterator


    【解决方案1】:

    是的,CachingIterator 将逐步添加项目。在 3 个项目的列表中,如果第一次发生迭代,则缓存将包含 1 个项目。如果下一次发生 2 次迭代,第一项将从缓存中检索,第二项将从内部列表中检索,然后缓存。等等等等。

    说明here。注意第一次输出数组中有一个项目,第二次有两个。另请注意,在这两种情况下,第一个对象是 same 对象,如对象编号所证明的那样,例如#1.

    另外,如果您的值不可字符串化,即无法转换为字符串,请不要忘记删除默认的CALL_TOSTRING 标志,或使用FULL_CACHE。否则会报错。

    另一个细节是,如果在CachingIterator 下的迭代器链中的某个地方有一个Generator,那么CachingIterator 就不能倒带,这意味着它不能在超过1 个foreach 循环中使用.这是违反直觉的 IMO,因为我预计,如果它正在缓存,那么它将遍历缓存。然而,显然它仍然试图回退内部迭代器,该迭代器将其沿链转发到生成器,最终产生致命错误。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多