萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> PHP中使用Memache作為進程鎖的操作類分享

PHP中使用Memache作為進程鎖的操作類分享

 這篇文章主要介紹了PHP中使用Memache作為進程鎖的操作類分享,本文直接給出類實現代碼以及應用示例,需要的朋友可以參考下

    ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 <?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); // 解鎖 
copyright © 萬盛學電腦網 all rights reserved