首页 > 开发 > PHP > 正文

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

2024-05-04 23:33:34
字体:
来源:转载
供稿:网友

这篇文章主要介绍了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. $this->onLockTimeoutFunc = $onLockTimeoutFunc
  37.  
  38.  
  39. /** 
  40. 连接memcache 服务器  
  41. */ 
  42. public function connect() { 
  43. if (! isset ( $this->oMemcache )) { 
  44. $this->oMemcache = new Memcache (); 
  45. $this->oMemcache->connect ( '127.0.0.1', 11211 ); 
  46. return $this->oMemcache; 
  47.  
  48.  
  49. /* 
  50. 向MeMcache中添加 key 
  51. */ 
  52. public addMemcache($sKey$sValue$iTimeout){ 
  53.  
  54. for($i= 0 ; $i<$this->iMemcacheRetryCount){ 
  55. $bRes = $this->oMemcache->add($sKey$sValue$iTimeout); 
  56. if($bRes){ 
  57. return true ;  
  58. // 如果加锁不成功,sleep 之后,从新加锁 
  59. usleep($this->iLockRetryInterval*1000); 
  60.  
  61. return false ;  
  62.  
  63.  
  64.  
  65. /* 
  66. 加锁  
  67. */ 
  68. public function lock($sLockID){ 
  69.  
  70. $oMemcache = $this->connect(); 
  71. $sKey = $this->sLockKeyPre . $sLockID
  72.  
  73. // 加锁如果不成功可以多试几次  
  74.  
  75. for($i = 0 ; $i <$this->iLockRetryCount ; $i++){ 
  76.  
  77. // 这里设置value 的值可以随便设置  
  78. if($this->addMemcache($sKey,'1',$this->iLockCacheTimeout)){ 
  79. return true ;  
  80.  
  81. // 如果加锁不成功,sleep 之后,从新加锁 
  82. usleep($this->iLockRetryInterval*1000); 
  83.  
  84.  
  85. // 若还不成功,则加锁失败,调用回调函数,.也就是失败后需要处理的操作  
  86. if(is_callable($this->onLockTimeoutFunc)){ 
  87. // 调用函数  
  88. call_user_func($this->onLockTimeoutFunc);  
  89.  
  90.  
  91.  
  92. /* 
  93. 解锁操作  
  94. */ 
  95. public function unlock($sLockID){ 
  96.  
  97. $oMemcache = $this->connect(); 
  98. $sKey = $this->sLockKeyPre . $sLockID
  99. // 删除key 
  100. return $this->oMemcache->delete($sKey); 
  101.  
  102.  
  103.  
  104. /** 
  105. 如果加锁不成功,则执行如下操作  
  106. */ 
  107. public function onLockTimeout(){ 
  108.  
  109. echo ("加锁超时"); 
  110.  
  111.  
  112.  
  113.  
  114. // 应用实例  
  115.  
  116. $oLock = new lock_processlock(); 
  117. $lockResource = "test"
  118. // 加锁 
  119. $oLock->lock($lockResource); 
  120. // 解锁 
  121. $oLock->unlock($lockResource); 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表