欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP中使用Memache作为进程锁的操作类分享

程序员文章站 2022-05-12 12:53:44
<?php

// 使用memache 作为进程锁 

class lock_processlock{
	
	
	// key 的前缀
	protected $slockkeypre;
	// 重试间隔
 protected $ilockretryinterval;
	//重试次数 
 protected $ilockretrycount;
	//锁的过期时间
 protected $ilockcachetimeout;
 // 锁过期后的回调函数
 protected $onlocktimeoutfunc;
	// memache 的实例
 protected $omemcache;
	// 存储memcache失败后重试次数 
 protected $imemcacheretrycount;
	
	
	
	
	 public function __construct ($onlocktimeoutfunc=null) {
  $alockconfig = get_config('', 'lock');
  $this->slockkeypre = self::lock_key_pre;
  $this->ilockretryinterval = self::lock_retry_interval;
  $this->ilockretrycount =self::lock_retry_count;
  $this->ilockcachetimeout = self::lock_cache_timeout;
  $this->imemcacheretrycount = self::lock_cache_timeout;
		if(!$onlocktimeoutfunc){
			// 如果加锁不成功则调用回调函数,如果没有回调函数,使用本类中所带的 
			$onlocktimeoutfunc ='onlocktimeout' ; 
		}
  $this->onlocktimeoutfunc = $onlocktimeoutfunc;
 }
	
	
	/**
	连接memcache 服务器 
	*/
	public function connect() {
		if (! isset ( $this->omemcache )) {
			$this->omemcache = new memcache ();
			$this->omemcache->connect ( '127.0.0.1', 11211 );
		}
		return $this->omemcache;
	}
	
	
	/*
	向memcache中添加 key
	*/
	public addmemcache($skey, $svalue, $itimeout){
		
		for($i= 0 ; $i<$this->imemcacheretrycount){
			$bres = $this->omemcache->add($skey, $svalue, $itimeout);
			if($bres){
				return true ; 
			}
				// 如果加锁不成功,sleep 之后,从新加锁
			usleep($this->ilockretryinterval*1000);
			
		}
		return false ; 
		
	}
	
	
	/*
	加锁 
	*/
	public function lock($slockid){
		
		$omemcache = $this->connect();
	 $skey = $this->slockkeypre . $slockid;
		
		// 加锁如果不成功可以多试几次 
		
		for($i = 0 ; $i <$this->ilockretrycount ; $i++){
			
			// 这里设置value 的值可以随便设置 
			if($this->addmemcache($skey,'1',$this->ilockcachetimeout)){
				return true ; 
			}
			
			// 如果加锁不成功,sleep 之后,从新加锁
			usleep($this->ilockretryinterval*1000);
			
		}
		
		// 若还不成功,则加锁失败,调用回调函数,.也就是失败后需要处理的操作 
		if(is_callable($this->onlocktimeoutfunc)){
			// 调用函数 
			call_user_func($this->onlocktimeoutfunc); 
		}
		
	}
	
	
	/*
	解锁操作 
	*/
	public function unlock($slockid){
		
		$omemcache = $this->connect();
	 $skey = $this->slockkeypre . $slockid;
		// 删除key
		return $this->omemcache->delete($skey);
		
	}
	
	
	/**
	如果加锁不成功,则执行如下操作 
	*/
	 public function onlocktimeout(){
		 
		 echo ("加锁超时");
	 }
  
}



// 应用实例 

 $olock = new lock_processlock();
 $lockresource = "test";
 // 加锁
 $olock->lock($lockresource);
 // 解锁
 $olock->unlock($lockresource);