国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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); 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和平区| 翼城县| 衡山县| 石狮市| 丹巴县| 闻喜县| 广宗县| 忻州市| 望奎县| 沙田区| 广昌县| 科尔| 日照市| 西吉县| 漠河县| 沈丘县| 通许县| 紫金县| 米易县| 专栏| 南澳县| 蒙城县| 沧州市| 鄂温| 得荣县| 辽源市| 宁陕县| 高唐县| 陇西县| 崇明县| 松潘县| 石泉县| 大姚县| 东丽区| 渭源县| 中方县| 大兴区| 获嘉县| 苗栗市| 栖霞市| 合作市|