免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4577 | 回复: 1

php下Memcache清理过期缓存内容 [复制链接]

论坛徽章:
0
发表于 2011-01-28 16:35 |显示全部楼层
我们经常会使用Memcached的存储过期功能,而实际上在过期后,Memcached并不能马上回收过期内容,这样会很快存满至配置限制,根据不同配置,Memcached会采用LRU算法删除缓存内容或使用时删除过期内容,而有时Memcached这样的释放内存的机制并不能满足所有应用,故我们在PHP基础上实现了统一删除过期内容的功能,适用于定时清理.

  1. <?php
  2. /**
  3. * mem_dtor:对Memcached的过期内存回收
  4. * Author:lajabs
  5. */
  6. class mem_dtor extends Memcache
  7. {
  8.         private $server_id;
  9.         public function __construct($host,$port)
  10.         {
  11.                 $this->server_id = "$host:$port";
  12.                 $this->connect($host,$port);
  13.         }

  14.         // 回收所有过期的内存
  15.         public function gc()
  16.         {
  17.                 $t = time();
  18.                 $_this = $this;
  19.                 $func = function($key,$info) use ($t,$_this)
  20.                 {
  21.                         if($info[1] - $t < -30)                                                                                //30秒过期的缓冲
  22.                         {
  23.                                 $_this->delete($key);
  24.                         }
  25.                 };
  26.                 $this->lists($func);
  27.         }

  28.         // 查看所有缓存内容的信息
  29.         public function info()
  30.         {
  31.                 $t = time();
  32.                 $func = function($key,$info) use ($t)
  33.                 {
  34.                         echo $key,' => Exp:',$info[1] - $t,"\n";                                        //查看缓存对象的剩余过期时间
  35.                 };
  36.                 $this->lists($func);
  37.         }

  38.         private function lists($func)
  39.         {
  40.                 $sid = $this->server_id;
  41.                 $items                        = $this->getExtendedStats('items');                                //获取memcached状态
  42.                 foreach($items[$sid]['items'] as $slab_id => $slab)                                //获取指定server id 的 所有Slab
  43.                 {
  44.                         $item        = $this->getExtendedStats('cachedump',$slab_id,0);        //遍历所有Slab                        
  45.                         foreach($item[$sid] as $key => $info)                                                //获取Slab中缓存对象信息
  46.                         {
  47.                                 $func($key,$info);
  48.                         }
  49.                 }        
  50.         }
  51. }

  52. $mem = new mem_dtor('127.0.0.1',11211);
  53. $mem->info();//查看状态
  54. $mem->gc();         //回收
  55. ?>
复制代码

论坛徽章:
0
发表于 2011-01-28 18:18 |显示全部楼层
标记
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP