Memcache + PHP - 为什么数据没有到期?

时间:2012-05-03 04:34:32

标签: php memcached

我有一个简单的例子,我将值设置为5秒。问题是5秒后;当我预期'假'时,我仍然会得到一个值。

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");


$memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry
var_dump($memcache->get('foo')); // bar
sleep(10);
var_dump($memcache->get('foo')); // still shows bar

这是memcache服务器版本

服务器版本:1.4.13

3 个答案:

答案 0 :(得分:5)

游戏的后期,但是在你的代码中,看起来你传递的是“0”(不是“5”),这意味着“永不过期”具体来说:

 $memcache->set('foo', 'bar', 0, 5); // 5 seconds expiry

应该是:

 $memcache->set('foo', 'bar', 5); // 5 seconds expiry

除非我误解the PHP documentation located here,这表明set命令有三个参数:

 public bool Memcached::set ( string $key , mixed $value [, int $expiration ] )

编辑:哎呀,我看到你正在使用Memcache扩展而不是Memcached,which does have four parmaters。也许尝试使用MEMCACHE_COMPRESSED常量而不是0来查看它是否有效:

 $memcache->set('foo', 'bar', MEMCACHE_COMPRESSED, 5); // 5 seconds expiry

答案 1 :(得分:1)

由于代码看起来很好 - 接下来的链接就是查看你的memcache PHP扩展版本无法正常工作,或者看看memcached服务器本身。

这很棘手。最简单的方法是首先排除memcached服务器。 (你可以安装一个php界面 - 但这对你的工作没有帮助。)所以......

在终端(或Windows中的命令窗口)中输入

 telnet localhost 11211

(注意 - 默认情况下,Windows中未安装telnet客户端 - 转到“控制面板”,“打开或关闭Windows功能”并从那里添加。)

这使您可以访问memcached。

然后输入

stats items

列出了memcached中的内存项。

希望你只有一块板,所以请记下它的编号和类型

stats cachedump [Number] 0

这将列出缓存中记录的内容。

如果这仍显示“bar”(采用编码格式),那么它的memcached服务器无法正常工作 - 升级为新版本。

如果这不显示“bar”(或者,最好,项目不存在 - 你会得到ERROR)然后它将是PHP的memcache扩展无法正常工作。再次,检查你的版本。

完成后,输入

quit

替代方法是检查“memcached”(php扩展)并用这些类重写PHP代码。它更新了。如果仍然失败,那肯定是memcached服务器;如果它的工作原理是它是php memcache扩展名。

答案 2 :(得分:0)

memcached服务器中存在一个错误,包括版本1.4.13到至少1.4.14,一旦memcached服务器运行了一段时间,它有时会进入一种模式,它将无法正确到期值。

重新启动服务为我修复了它,我希望新版本能够更加永久地修复它。