超时后APC用户缓存条目未被删除

时间:2013-09-10 01:57:57

标签: caching apc

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

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

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

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

These should have been removed?

2 个答案:

答案 0 :(得分:7)

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

生存时间(TTL)机制用于将条目标记为“已过期”,但过期的条目不会自动删除,也不应该被删除,因为APC配置了固定的内存大小(使用apc.shm_size配置)项目)并且没有必要删除条目没有优势。 APC文档中有以下内容:

  

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

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

更具体地说,我假设您使用apc_add / apc_store函数添加条目,这与apc.user_ttl类似,文档解释为:

  

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

请注意“in case”声明。我再次认为缓存管理器不保证删除条目的准确时间,而是尝试保证您的条目在过期之前保持有效。换句话说,缓存管理器会更加努力地保留条目而不是删除条目。

答案 1 :(得分:1)

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