PHP中使用Memache作為進程鎖的操作類分享
來源:易賢網 閱讀:1208 次 日期:2015-04-03 10:28:03
溫馨提示:易賢網小編為您整理了“PHP中使用Memache作為進程鎖的操作類分享”,方便廣大網友查閱!

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

<?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);

}

/**

如果加鎖不成功,則執(zhí)行如下操作

*/

public function onLockTimeout(){

echo ("加鎖超時");

}

}

// 應用實例

$oLock = new lock_processlock();

$lockResource = "test";

// 加鎖

$oLock->lock($lockResource);

// 解鎖

更多信息請查看IT技術專欄

更多信息請查看網絡編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網