<?php
//使用Memache作为进程锁
classlock_processlock{
//key的前缀
protected$sLockKeyPre;
//重试间隔
protected$iLockRetryInterval;
//重试次数
protected$iLockRetryCount;
//锁的过期时间
protected$iLockCacheTimeout;
//锁过期后的回调函数
protected$onLockTimeoutFunc;
//memache的实例
protected$oMemcache;
//存储memcache失败后重试次数
protected$iMemcacheRetryCount;
publicfunction__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服务器
*/
publicfunctionconnect(){
if(!isset($this->oMemcache)){
$this->oMemcache=newMemcache();
$this->oMemcache->connect('127.0.0.1',11211);
}
return$this->oMemcache;
}
/*
向MeMcache中添加key
*/
publicaddMemcache($sKey,$sValue,$iTimeout){
for($i=0;$i<$this->iMemcacheRetryCount){
$bRes=$this->oMemcache->add($sKey,$sValue,$iTimeout);
if($bRes){
returntrue;
}
//如果加锁不成功,sleep之后,从新加锁
usleep($this->iLockRetryInterval*1000);
}
returnfalse;
}
/*
加锁
*/
publicfunctionlock($sLockID){
$oMemcache=$this->connect();
$sKey=$this->sLockKeyPre.$sLockID;
//加锁如果不成功可以多试几次
for($i=0;$i<$this->iLockRetryCount;$i++){
//这里设置value的值可以随便设置
if($this->addMemcache($sKey,'1',$this->iLockCacheTimeout)){
returntrue;
}
//如果加锁不成功,sleep之后,从新加锁
usleep($this->iLockRetryInterval*1000);
}
//若还不成功,则加锁失败,调用回调函数,.也就是失败后需要处理的操作
if(is_callable($this->onLockTimeoutFunc)){
//调用函数
call_user_func($this->onLockTimeoutFunc);
}
}
/*
解锁操作
*/
publicfunctionunlock($sLockID){
$oMemcache=$this->connect();
$sKey=$this->sLockKeyPre.$sLockID;
//删除key
return$this->oMemcache->delete($sKey);
}
/**
如果加锁不成功,则执行如下操作
*/
publicfunctiononLockTimeout(){
echo("加锁超时");
}
}
//应用实例
$oLock=newlock_processlock();
$lockResource="test";
//加锁
$oLock->lock($lockResource);
//解锁
$oLock->unlock($lockResource);