APC用户缓存条目没有过期

5

每次运行这段代码时,我看到5个输出:

<?php
$v = 5;
apc_store('vwxyz',$v,3);
$before = apc_fetch('vwxyz');
sleep(5);
$after = apc_fetch('vwxyz'); //should be false
echo $before;
echo "<br>";
echo $after;
$later = apc_fetch('vwxyz'); //OK this should definitely be false
echo "<br>";
echo $later;

是否应该从缓存中清除缓存条目并向apc_fetch()返回false? APC的user_ttl设置为2。 我还在努力弄清楚user_ttl的作用(文档非常神秘)。

1个回答

5

根据手册所述:

存活时间(Time To Live):将var缓存ttl秒。在ttl过期后,存储的变量将从缓存中删除(在下一个请求时)。如果没有提供ttl(或者ttl为0),则该值将一直保留,直到手动从缓存中删除,或者在缓存中不存在(清除、重启等)。

因此,它表示在TTL之后的下一个请求时,项目才会从缓存中移除。所以这个项目直到下一个请求才会从缓存中删除,这就是为什么你一直得到5的原因。


谢谢Drew。下一个请求是什么意思?$later = apc_fetch('vwxyz'); 不算作下一个请求吗? - tinkerr
2
@tinkerr 下一页请求,我想是指重新加载页面。 - John V.
@tinkerr 是的,我相信他们所说的下一个请求是指对 PHP 的下一页请求。您可以通过获取一个值、打印结果、将某些内容存储到该键中并让请求结束来测试此功能。等待 1 秒钟,然后刷新页面(它应该仍然被设置)。然后等待 5 秒或更长时间,刷新页面(该值应该已经消失了)。 - drew010
也遇到了这个问题,读手册时理解为“apc请求”而不是“页面请求”,导致我的单元测试无效。唉。 - Martin Lyne
一样,我的单元测试失败了,我也不知道为什么。不能使用单元测试来测试ttl真是太糟糕了。 - Sophie McCarrell
我刚进行了更多的测试,所有缓存都在读取或写入操作之后清除和维护。因此,如果您使用1秒的ttl将内容写入缓存,等待2秒钟,然后从相同的缓存键读取,则它仍将存在,然后在读取后被擦除。 如果您使用1秒的ttl将内容写入缓存,等待2秒钟,然后从不同的缓存键读取,然后尝试从ttl 1键读取,则它已被擦除。基本上,缓存在任何缓存调用后清除TTL过期的键。这些复杂性就是为什么我不担心性能问题,直到出现瓶颈的原因。 - Sophie McCarrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接