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


Memcache + PHP - Why data is not expiring?

我有一个简单的例子,我设置了一个 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

这是内存缓存服务器版本

服务器版本:1.4.13

游戏迟到了,但在您的代码中,看起来您正在传递"0"作为过期(而不是"5"(,这意味着"永不过期" 具体来说:

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

应该是:

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

除非我误解了位于这里的 PHP 文档,该文档显示 set 命令采用三个参数:

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

编辑:哎呀,我看到您使用的是Memcache扩展而不是Memcached,它确实有四个参数。 也许尝试使用 MEMCACHE_COMPRESSED 常量而不是 0 看看它是否有效:

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

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

重新启动服务为我修复了它,我希望较新的版本可以更永久地修复它。

由于代码看起来不错 - 下一个链条是查看您的 memcache PHP 扩展版本不起作用,或者 memcached 服务器本身。

这很棘手。最简单的方法是先排除 memcached 服务器。(你可以安装一个php接口 - 但这不会帮助你弄清楚哪一点。所以。。。

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

 telnet localhost 11211

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

这使您可以访问内存缓存。

然后键入

stats items

其中列出了内存缓存中的内存项。

希望你只有一块板,所以请注意它的数量和类型

stats cachedump [Number] 0

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

如果这仍然显示"bar"(编码格式(,则它是 memcached 服务器不工作 - 升级到较新版本。

如果这没有显示"bar"(或者,最好是,该项目不存在 - 你会得到 ERROR(,那么它将是 PHP 的 memcache 扩展不起作用。再次,检查您的版本。

完成后,键入

quit

另一种方法是签出"memcached"(php扩展(并使用这些类重写PHP代码。它比较新。如果仍然失败,那肯定是内存缓存服务器;如果这有效,那就是PHP MemCache扩展。