您好,欢迎访问一九零五行业门户网

php的memcache类分享_PHP教程

这篇文章主要介绍了php的memcache类的使用方法(memcache队列),需要的朋友可以参考下
memcachequeue.class.php  代码如下:add('1asdf'); * $obj->getqueuelength(); * $obj->read(10); * $obj->get(8); */class memcachequeue{ public static $client;   //memcache客户端连接 public   $access;   //队列是否可更新 private   $expire;   //过期时间,秒,1~2592000,即30天内 private   $sleeptime;   //等待解锁时间,微秒 private   $queuename;   //队列名称,唯一值 private   $retrynum;   //重试次数,= 10 * 理论并发数 public   $currenthead;  //当前队首值 public   $currenttail;  //当前队尾值  const maxnum  = 20000;    //最大队列数,建议上限10k const head_key = '_lkkqueuehead_';  //队列首kye const tail_key = '_lkkqueuetail_';  //队列尾key const valu_key = '_lkkqueuevalu_';  //队列值key const lock_key = '_lkkqueuelock_';  //队列锁key     /**     * 构造函数     * @param string $queuename  队列名称     * @param int $expire 过期时间     * @param array $config  memcache配置     *      * @return      */ public function __construct($queuename ='',$expire=0,$config =''){  if(empty($config)){   self::$client = memcache_pconnect('127.0.0.1',11211);  }elseif(is_array($config)){//array('host'=>'127.0.0.1','port'=>'11211')   self::$client = memcache_pconnect($config['host'],$config['port']);  }elseif(is_string($config)){//127.0.0.1:11211   $tmp = explode(':',$config);   $conf['host'] = isset($tmp[0]) ? $tmp[0] : '127.0.0.1';   $conf['port'] = isset($tmp[1]) ? $tmp[1] : '11211';   self::$client = memcache_pconnect($conf['host'],$conf['port']);  }  if(!self::$client) return false;   ignore_user_abort(true);//当客户断开连接,允许继续执行  set_time_limit(0);//取消脚本执行延时上限   $this->access = false;  $this->sleeptime = 1000;  $expire = empty($expire) ? 3600 : intval($expire)+1;  $this->expire = $expire;  $this->queuename = $queuename;  $this->retrynum = 1000;   $this->head_key = $this->queuename . self::head_key;  $this->tail_key = $this->queuename . self::tail_key;  $this->lock_key = $this->queuename . self::lock_key;   $this->_initsetheadntail(); }     /**     * 初始化设置队列首尾值     */ private function _initsetheadntail(){  //当前队列首的数值  $this->currenthead = memcache_get(self::$client, $this->head_key);  if($this->currenthead === false) $this->currenthead =0;   //当前队列尾的数值  $this->currenttail = memcache_get(self::$client, $this->tail_key);  if($this->currenttail === false) $this->currenttail =0; }     /**     * 当取出元素时,改变队列首的数值  * @param int $step 步长值     */ private function _changehead($step=1){  $this->currenthead += $step;  memcache_set(self::$client, $this->head_key,$this->currenthead,false,$this->expire); }     /**     * 当添加元素时,改变队列尾的数值  * @param int $step 步长值     * @param bool $reverse 是否反向     * @return null     */ private function _changetail($step=1, $reverse =false){  if(!$reverse){   $this->currenttail += $step;  }else{   $this->currenttail -= $step;  }   memcache_set(self::$client, $this->tail_key,$this->currenttail,false,$this->expire); }     /**     * 队列是否为空     * @return bool     */ private function _isempty(){  return (bool)($this->currenthead === $this->currenttail); }     /**     * 队列是否已满     * @return bool     */ private function _isfull(){  $len = $this->currenttail - $this->currenthead;  return (bool)($len === self::maxnum); }     /**     * 队列加锁     */ private function _getlock(){  if($this->access === false){   while(!memcache_add(self::$client, $this->lock_key, 1, false, $this->expire) ){    usleep($this->sleeptime);    @$i++;    if($i > $this->retrynum){//尝试等待n次     return false;     break;    }   }    $this->_initsetheadntail();   return $this->access = true;  }   return $this->access; }     /**     * 队列解锁     */ private function _unlock(){  memcache_delete(self::$client, $this->lock_key, 0);  $this->access = false; }     /**     * 获取当前队列的长度     * 该长度为理论长度,某些元素由于过期失效而丢失,真实长度_initsetheadntail();  return intval($this->currenttail - $this->currenthead); }     /**     * 添加队列数据     * @param void $data 要添加的数据     * @return bool     */ public function add($data){  if(!$this->_getlock()) return false;   if($this->_isfull()){   $this->_unlock();   return false;  }   $value_key = $this->queuename . self::valu_key . strval($this->currenttail +1);  $result = memcache_set(self::$client, $value_key, $data, memcache_compressed, $this->expire);  if($result){   $this->_changetail();  }   $this->_unlock();  return $result; }     /**     * 读取队列数据     * @param int $length 要读取的长度(反向读取使用负数)     * @return array     */ public function read($length=0){  if(!is_numeric($length)) return false;  $this->_initsetheadntail();   if($this->_isempty()){   return false;  }   if(empty($length)) $length = self::maxnum;//默认所有  $keyarr = array();  if($length >0){//正向读取(从队列首向队列尾)   $tmpmin = $this->currenthead;   $tmpmax = $tmpmin + $length;   for($i= $tmpmin; $iqueuename . self::valu_key . $i;   }  }else{//反向读取(从队列尾向队列首)   $tmpmax = $this->currenttail;   $tmpmin = $tmpmax + $length;   for($i= $tmpmax; $i >$tmpmin; $i--){    $keyarr[] = $this->queuename . self::valu_key . $i;   }  }   $result = @memcache_get(self::$client, $keyarr);   return $result; }     /**     * 取出队列数据     * @param int $length 要取出的长度(反向读取使用负数)     * @return array     */ public function get($length=0){  if(!is_numeric($length)) return false;  if(!$this->_getlock()) return false;   if($this->_isempty()){   $this->_unlock();   return false;  }   if(empty($length)) $length = self::maxnum;//默认所有  $length = intval($length);  $keyarr = array();  if($length >0){//正向读取(从队列首向队列尾)   $tmpmin = $this->currenthead;   $tmpmax = $tmpmin + $length;   for($i= $tmpmin; $iqueuename . self::valu_key . $i;   }   $this->_changehead($length);  }else{//反向读取(从队列尾向队列首)   $tmpmax = $this->currenttail;   $tmpmin = $tmpmax + $length;   for($i= $tmpmax; $i >$tmpmin; $i--){    $keyarr[] = $this->queuename . self::valu_key . $i;   }   $this->_changetail(abs($length), true);  }  $result = @memcache_get(self::$client, $keyarr);   foreach($keyarr as $v){//取出之后删除   @memcache_delete(self::$client, $v, 0);  }   $this->_unlock();   return $result; }     /**     * 清空队列     */ public function clear(){  if(!$this->_getlock()) return false;   if($this->_isempty()){   $this->_unlock();   return false;  }   $tmpmin = $this->currenthead--;  $tmpmax = $this->currenttail++;   for($i= $tmpmin; $iqueuename . self::valu_key . $i;   @memcache_delete(self::$client, $tmpkey, 0);  }   $this->currenttail = $this->currenthead = 0;  memcache_set(self::$client, $this->head_key,$this->currenthead,false,$this->expire);  memcache_set(self::$client, $this->tail_key,$this->currenttail,false,$this->expire);   $this->_unlock(); }  /*  * 清除所有memcache缓存数据  */ public function memflush(){  memcache_flush(self::$client); } }//end class
http://www.bkjia.com/phpjc/746591.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/746591.htmltecharticle这篇文章主要介绍了php的memcache类的使用方法(memcache队列),需要的朋友可以参考下 memcachequeue.class.php代码如下:?php/*** php memcache 队列类* @aut...
其它类似信息

推荐信息