<?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);
// 解锁
$olock->unlock($lockresource);
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!