php memcached 使用教程
在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历所有Memcached服务器上的key,但是并不保证原子操作,而后者却没有提供任何方法,虽然在PHP官方
文档中有人给出使用方法getExtendedStats来间接获取Memcached服务器上的所有key,但是给出的代码是有不少坑的,如果拿来就用,对于cluster的memcached服务器而言,有些问题就需要指出来。
???????下面将给出官方文档中的代码,并指出可能面临的问题,代码如下:
connect('127.0.0.1',?11211)?or?die?("Could?not?connect?to?memcache?server");
$list?=?array();
$allSlabs?=?$memcache->getExtendedStats('slabs');
$items?=?$memcache->getExtendedStats('items');
foreach($allSlabs?as?$server?=>?$slabs)?{
???foreach($slabs?AS?$slabId?=>?$slabMeta)?{
??????$cdump?=?$memcache->getExtendedStats('cachedump',(int)$slabId);
??????foreach($cdump?AS?$keys?=>?$arrVal)?{
?????????foreach($arrVal?AS?$k?=>?$v){
???????????echo?$k?."
";
?????????}
??????}
????}
}//EO?getMemcacheKeys()??>
???????在上述代码中,如果用于获取单个memcached服务器上的key,是不存在任何问题,但是获取连接池中的多个memcached所有key就存在问题,会发现打印出重复的key,问题就在于当使用getExtendedStats用去特定$slabID
上的信息时,返回的是连接池中所有的服务器上的特定$slabId?的存储的keys信息。当$server为"127.0.0.1:11214"且$slabId为0将变量$cdump的信息打印出如下所示:
array(2)?{
??["127.0.0.1:11214"]=>
??array(1)?{
????["course_schools__??¨é?¨"]=>
????array(2)?{
??????[0]=>
??????string(1)?"0"?[1]=>
??????string(10)?"12"?}
??}
??["127.0.0.1:11216"]=>
??array(1)?{
????["monitorMemcache"]=>
????array(2)?{
??????[0]=>
??????string(2)?"10"?[1]=>
??????string(10)?"12"?}
??}
}
当$server为"127.0.0.1:11216"且$slabId为0将变量$cdump的信息打印出如下所示:
array(2)?{
??["127.0.0.1:11214"]=>
??array(1)?{
????["course_schools__??¨é?¨"]=>
????array(2)?{
??????[0]=>
??????string(1)?"0"?[1]=>
??????string(10)?"12"?}
??}
??["127.0.0.1:11216"]=>
??array(1)?{
????["monitorMemcache"]=>
????array(2)?{
??????[0]=>
??????string(2)?"10"?[1]=>
??????string(10)?"12"?}
??}
}
看了你的使用,对一点有疑惑,getextendedstats的第三个参数不是用来设置从服务端获取的实体条数的吗,你这里设置为0的话,那还指望它返回什么了??
0
0
0
0
评论(0)
“还没有人发表评论,快去抢占沙发吧”