11

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

4

3 回答 3

5

游戏迟到了,但在您的代码中,您似乎将“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,它确实有四个 parmaters。也许尝试使用 MEMCACHE_COMPRESSED 常量而不是 0 来查看它是否有效:

 $memcache->set('foo', 'bar', MEMCACHE_COMPRESSED, 5); // 5 seconds expiry
于 2012-12-24T07:54:04.777 回答
2

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

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

于 2015-10-24T04:52:51.233 回答
1

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

这有点棘手。最简单的方法是首先排除 memcached 服务器。(您可以安装一个 php 界面 - 但这不会帮助您解决问题。)所以...

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

 telnet localhost 11211

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

这使您可以访问 memcached。

然后输入

stats items

它列出了 memcached 中的内存项。

希望你只有一块平板,所以记下它的数量和类型

stats cachedump [Number] 0

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

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

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

完成后,输入

quit

另一种方法是检查“memcached”(php 扩展)并用这些类重写您的 PHP 代码。它较新。如果仍然失败,那肯定是 memcached 服务器;如果这行得通,那就是 php memcache 扩展。

于 2012-05-04T04:04:55.717 回答