Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memcache+;PHP-为什么数据没有过期?_Php_Memcached - Fatal编程技术网

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

Memcache+;PHP-为什么数据没有过期?,php,memcached,Php,Memcached,我有一个简单的例子,我设置了一个5秒的值。问题是5秒后,;当我期望“false”时,我仍然返回一个值 $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')); // b

我有一个简单的例子,我设置了一个5秒的值。问题是5秒后,;当我期望“false”时,我仍然返回一个值

$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

代码看起来不错-接下来的一个环节是查看您的memcache PHP扩展版本不工作,或者memcached服务器本身

这是一个复杂但棘手的问题。最简单的方法是首先排除memcached服务器。(你可以安装一个php接口——但这对你的工作毫无帮助。)所以

终端中(或窗口中的命令窗口)类型

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

这使您可以访问memcached

然后键入

stats items
其中列出了memcached中的内存项

希望您只有一个楼板,所以请注意其编号和类型

stats cachedump [Number] 0
这将列出缓存中记录的内容

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

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

完成后,键入

quit


另一种方法是签出“memcached”(php扩展)并用这些类重写php代码。它是新的。如果仍然失败,则肯定是memcached服务器;如果成功的话,那就是php memcache扩展。

游戏后期,但在您的代码中,您似乎通过了“0”表示过期(而不是“5”),具体地说,它转换为“永不过期”:

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

 $memcache->set('foo', 'bar', 5); // 5 seconds expiry
除非我误解了,这表明set命令使用三个参数:

 public bool Memcached::set ( string $key , mixed $value [, int $expiration ] )
编辑:哎呀,我看到你使用的是Memcache扩展,而不是Memcached。也许可以尝试使用MEMCACHE_压缩常量而不是0来查看它是否有效:

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

memcached服务器(包括1.4.13版到至少1.4.14版)中存在一个bug,一旦memcached服务器运行了一段时间,它有时会进入一种无法正确终止值的模式


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

我很好奇,因为我在我的机器上进行了测试,在第二种情况下我看到bool(false)。我在两个outputsTry中看到“bar”休眠10秒,只是为了消除任何可能的重叠。我也无法复制。工作正常。@MikePurcell睡眠10秒显示相同的结果:(:(以下是我获得的统计项目统计项目:1:1号统计项目:1:年龄15统计项目:1:驱逐0统计项目:1:驱逐非零0统计项目:1:驱逐时间0统计项目:1:outofmemory 0统计项目:1:tailrepairs 0统计项目:1:回收0统计项目:1:过期未驱逐0统计项目:1:驱逐未蚀刻0这是否意味着memcache服务器已关闭由于项目仍在缓存中而无法工作?请尝试上面的最后一条指令(stats CachedDump 1 0),它应该会返回一些信息。我在哪里可以找到有关此信息?它在1.5.x版本中是否已修复?不幸的是,已确认
1.4.15
中也存在此问题
 $memcache->set('foo', 'bar', MEMCACHE_COMPRESSED, 5); // 5 seconds expiry