megnlingling 发表于 2017-12-30 18:07:53

转:php 获取memcache所有key

在php提供的用于与memcached交互的扩展模块中有memcached与memcache,前者提供方法getAllKeys用于遍历所有Memcached服务器上的key,但是并不保证原子操作,而后者却没有提供任何方法,虽然在PHP官方  
文档中有人给出使用方法getExtendedStats来间接获取Memcached服务器上的所有key,但是给出的代码是有不少坑的,如果拿来就用,对于cluster的memcached服务器而言,有些问题就需要指出来。
  下面将给出官方文档中的代码,并指出可能面临的问题,代码如下:
  

<?php  

/*\*  
* Function to get all memcache keys
  
* @author Manish Patel
  
* @Created:28-May-2010
  
\
*/  
function getMemcacheKeys() {
  
$memcache = new Memcache;
  
$memcache->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) {
=>
  string(1) "0" =>
  string(10) "12" }
  }
["127.0.0.1:11216"]=>
  array(1) {
["monitorMemcache"]=>
  array(2) {
=>
  string(2) "10" =>
  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) {
=>
  string(1) "0" =>
  string(10) "12" }
  }
["127.0.0.1:11216"]=>
  array(1) {
["monitorMemcache"]=>
  array(2) {
=>
  string(2) "10" =>
  string(10) "12" }
  }
  
}
页: [1]
查看完整版本: 转:php 获取memcache所有key