PHP中使用Memache作为进程锁的操作类分享


Posted in PHP onMarch 30, 2015
<?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);
PHP 相关文章推荐
一些使用频率比较高的php函数
Oct 03 PHP
用Zend Encode编写开发PHP程序
Feb 21 PHP
php数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
PHP常用数组函数介绍
Jul 28 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
Symfony2开发之控制器用法实例分析
Feb 05 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
Thinkphp5结合layer弹窗定制操作结果页面
Jul 07 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
PHP实现百度人脸识别
May 06 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 #PHP
smarty模板引擎之分配数据类型
Mar 30 #PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 #PHP
smarty模板引擎基础知识入门
Mar 30 #PHP
php array_merge函数使用需要注意的一个问题
Mar 30 #PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 #PHP
PHP实现动态柱状图改进版
Mar 30 #PHP
You might like
隐藏你的.php文件的实现方法
2007/03/19 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
javascript的函数
2007/01/31 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
jQuery实现定时隐藏对话框的方法分析
2018/02/12 jQuery
微信小程序实现发红包功能
2018/07/11 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
vue webpack打包后图片路径错误的完美解决方法
2018/12/07 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
大学生实习思想汇报
2014/01/12 职场文书
年度考核评语
2014/01/19 职场文书
学校门卫管理制度
2014/01/30 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
村干部任职承诺书
2015/01/21 职场文书
2015年副班长工作总结
2015/05/15 职场文书