有這麼一個需求:組建檔案的時候,由於多使用者都有許可權進行產生,防止並發下,導致產生的結果出現錯誤,需要對產生的過程進行加鎖,只容許一個使用者在一個時間內進行操作,這個時候就需要用到鎖了,將這個操作過程鎖起來。在用了cache的時候,cache失效可能導致瞬間的多數並發請求穿透到資料庫此時也可以得需要用鎖在同一併發的過程中將這個伺服器用戶端檔案鎖。
針對以上的2種情況,現在的解決方案是對處理過程進行鎖機制,通過PHP實現如下:
用到了Eaccelerator的記憶體鎖和檔案鎖,原理:判斷系統中是否安了EAccelerator如果有則使用記憶體鎖,如果不存在,則進行檔案鎖。根據帶入的key的不同可以實現多個鎖直接的平行處理,類似Innodb的行級鎖。
具體類如下:
eAccelerator = function_exists("eaccelerator_lock");if(!$this->eAccelerator){$this->path = $path.($this->_mycrc32($name) % $this->hashNum).'.txt';}$this->name = $name;}/** * crc32 * crc32封裝 * @param int $string * @return int */private function _mycrc32($string){$crc = abs (crc32($string));if ($crc & 0x80000000) {$crc ^= 0xffffffff;$crc += 1;}return $crc;}/** * 加鎖 * Enter description here ... */public function lock(){//如果無法開啟ea記憶體鎖,則開啟檔案鎖if(!$this->eAccelerator){//配置目錄許可權可寫$this->fp = fopen($this->path, 'w+');if($this->fp === false){return false;}return flock($this->fp, LOCK_EX);}else{return eaccelerator_lock($this->name);}}/** * 解鎖 * Enter description here ... */public function unlock(){if(!$this->eAccelerator){if($this->fp !== false){flock($this->fp, LOCK_UN);clearstatcache();}//進行關閉fclose($this->fp);}else{return eaccelerator_unlock($this->name);}}}?>
使用如下:
$lock = new CacheLock('key_name');$lock->lock();//logic here$lock->unlock();//使用過程中需要注意下檔案鎖所在路徑需要有寫入權限.
http://www.bkjia.com/PHPjc/752442.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/752442.htmlTechArticle有這麼一個需求:組建檔案的時候,由於多使用者都有許可權進行產生,防止並發下,導致產生的結果出現錯誤,需要對產生的過程進行加鎖,...