首页 > 解决方案 > CachingIterator 是否增量缓存?

问题描述

我想缓存一个列表中的东西,这些东西真的只能检索一次。列表中的项目是从文件列表中检索的可调用对象,并且对这些文件的访问权限不得超过一次。如果再次访问该文件,则会破坏该软件。

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

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

标签: phpcachingiterator

解决方案


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

在此处进行了说明。注意第一次在输出数组中有一个项目,第二次有两个。还要注意在这两种情况下第一个对象如何是同一个对象,这可以通过对象编号来证明,例如#1

此外,如果您的值不可字符串化,即无法转换为字符串,请不要忘记删除默认CALL_TOSTRING标志,或使用FULL_CACHE. 否则,您将收到错误消息。

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


推荐阅读