当前位置:首页 > PHP教程 > php类库 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-19 10:18:07 浏览: 评论:0 

这篇文章主要介绍了PHP中使用Memache作为进程锁的操作类分享,本文直接给出类实现代码以及应用示例,需要的朋友可以参考下:

  1. <?php 
  2.  
  3. // 使用Memache 作为进程锁  
  4.  
  5. class lock_processlock{ 
  6.       
  7.       
  8.     // key 的前缀 
  9.     protected $sLockKeyPre
  10.     // 重试间隔 
  11.  protected $iLockRetryInterval
  12.     //重试次数  
  13.  protected $iLockRetryCount
  14.     //锁的过期时间 
  15.  protected $iLockCacheTimeout
  16.  // 锁过期后的回调函数 
  17.  protected $onLockTimeoutFunc
  18.     // memache 的实例 
  19.  protected $oMemcache
  20.     // 存储memcache失败后重试次数  
  21.  protected $iMemcacheRetryCount
  22.       
  23.       
  24.       
  25.       
  26.      public function __construct ($onLockTimeoutFunc=NULL) { 
  27.   $aLockConfig = get_config('''lock'); 
  28.   $this->sLockKeyPre = self::LOCK_KEY_PRE; 
  29.   $this->iLockRetryInterval = self::LOCK_RETRY_INTERVAL; 
  30.   $this->iLockRetryCount =self::LOCK_RETRY_COUNT; 
  31.   $this->iLockCacheTimeout = self::LOCK_CACHE_TIMEOUT; 
  32.   $this->iMemcacheRetryCount = self::LOCK_CACHE_TIMEOUT; 
  33.         if(!$onLockTimeoutFunc){ 
  34.             // 如果加锁不成功则调用回调函数,如果没有回调函数,使用本类中所带的  
  35.             $onLockTimeoutFunc ='onLockTimeout' ;  
  36.         } 
  37.   $this->onLockTimeoutFunc = $onLockTimeoutFunc
  38.  } 
  39.       
  40.       
  41.     /** 
  42.     连接memcache 服务器  
  43.     */ 
  44.     public function connect() { 
  45.         if (! isset ( $this->oMemcache )) { 
  46.             $this->oMemcache = new Memcache (); 
  47.             $this->oMemcache->connect ( '127.0.0.1', 11211 ); 
  48.         } 
  49.         return $this->oMemcache; 
  50.     } 
  51.       
  52.       
  53.     /* 
  54.     向MeMcache中添加 key 
  55.     */ 
  56.     public addMemcache($sKey$sValue$iTimeout){ 
  57.           
  58.         for($i= 0 ; $i<$this->iMemcacheRetryCount){ 
  59.             $bRes = $this->oMemcache->add($sKey$sValue$iTimeout); 
  60.             if($bRes){ 
  61.                 return true ;  
  62.             } 
  63.                 // 如果加锁不成功,sleep 之后,从新加锁 
  64.             usleep($this->iLockRetryInterval*1000); 
  65.               
  66.         } 
  67.         return false ;  
  68.           
  69.     } 
  70.       
  71.       
  72.     /* 
  73.     加锁  
  74.     */ 
  75.     public function lock($sLockID){ 
  76.           
  77.         $oMemcache = $this->connect(); 
  78.      $sKey = $this->sLockKeyPre . $sLockID
  79.           
  80.         // 加锁如果不成功可以多试几次  
  81.           
  82.         for($i = 0 ; $i <$this->iLockRetryCount ; $i++){ 
  83.               
  84.             // 这里设置value 的值可以随便设置  
  85.             if($this->addMemcache($sKey,'1',$this->iLockCacheTimeout)){ 
  86.                 return true ;  
  87.             } 
  88.               
  89.             // 如果加锁不成功,sleep 之后,从新加锁 
  90.             usleep($this->iLockRetryInterval*1000); 
  91.               
  92.         } 
  93.           
  94.         // 若还不成功,则加锁失败,调用回调函数,.也就是失败后需要处理的操作  
  95.         if(is_callable($this->onLockTimeoutFunc)){ 
  96.             // 调用函数  
  97.             call_user_func($this->onLockTimeoutFunc);  
  98.         } 
  99.           
  100.     } 
  101.       
  102.       
  103.     /* 
  104.     解锁操作  
  105.     */ 
  106.     public function unlock($sLockID){ 
  107.           
  108.         $oMemcache = $this->connect(); 
  109.      $sKey = $this->sLockKeyPre . $sLockID
  110.         // 删除key 
  111.         return $this->oMemcache->delete($sKey); 
  112.           
  113.     } 
  114.       
  115.       
  116.     /** 
  117.     如果加锁不成功,则执行如下操作  
  118.     */ 
  119.      public function onLockTimeout(){ 
  120.            
  121.          echo ("加锁超时"); 
  122.      } 
  123.     
  124.  
  125.  
  126.  
  127. // 应用实例  
  128.  
  129.  $oLock = new lock_processlock(); 
  130.  $lockResource = "test"
  131.  // 加锁 
  132.  $oLock->lock($lockResource); 
  133.  // 解锁 
  134.  $oLock->unlock($lockResource);

Tags: Memache PHP进程锁

分享到: