2

我运行 APC 主要是为了缓存对象和查询数据作为用户缓存条目,它设置的每个项目都有一个与缓存所需时间相关的特定时间,有些项目是 48 小时,但更多的是 2-5 分钟。

我的理解是,当达到超时并且当前时间过去created at时,该项目应自动从user cache entries?

但这似乎并没有发生,而这些项目却保留在内存中?我想也许垃圾收集器会删除这些项目,但即使它现在每小时运行一次,它似乎也没有完成。

我能想到的唯一另一件事是默认值apc.user_ttl = 0会覆盖各个超时值并将它们设置为即使在各个超时之后也永远不会被删除?

这些应该被删除?

4

2 回答 2

7

一般来说,缓存管理器应该尽可能长时间地保留您的条目,并且可以在必要时删除它们。

存在 Time-To-Live (TTL) 机制以将条目标记为“过期”,但过期的条目不会自动删除,也不应该自动删除,因为 APC 配置了固定的内存大小(使用 apc.shm_size 配置项)和当您不必删除条目时,删除条目没有任何优势。APC 文档中有以下内容:

如果 APC 正在工作,缓存完整计数(左侧)将显示缓存达到最大容量并且必须强制清除在最后 apc.ttl 秒内未访问的任何条目的次数。

我认为这意味着如果缓存从未“达到最大容量”,则根本不会进行垃圾收集,这是正确的做法。

更具体地说,我假设您正在使用 apc_add/apc_store 函数来添加条目,这与 apc.user_ttl 具有类似的效果,文档对此进行了解释:

如果另一个条目需要此缓存条目插槽,则允许缓存条目在插槽中空闲的秒数

请注意“以防万一”声明。我再次认为这意味着缓存管理器不保证删除您的条目的精确时间,而是尝试保证您的条目在过期之前保持有效。换句话说,缓存管理器将更多的精力放在保留条目而不是删除它们上。

于 2013-09-15T06:47:59.800 回答
1

apc.ttl 不会做任何事情,除非分配的内存不足以存储新的变量,如果有足够的内存,缓存将永远不会过期!!。因此,您必须使用 apc_store() 或 apc_add() 为您存储的每个变量指定 ttl,以强制 apc 在传递给函数的指定 ttl 结束后重新生成它。如果您使用操作码缓存,它也永远不会过期,除非页面被修改(当 stat=1 时)或没有内存。所以 apc.user_ttl 或 apc.ttl 实际上是无关的。

于 2013-09-16T00:19:53.730 回答