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类
Jul 15 PHP
新浪新闻小偷
Oct 09 PHP
php mysql索引问题
Jun 07 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
php 操作excel文件的方法小结
Dec 31 PHP
用PHP实现 上一篇、下一篇的代码
Sep 29 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
一个完整的PHP类包含的七种语法说明
Jun 04 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
php统计数组不同元素的个数的实例方法
Sep 26 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中var_export与var_dump的区别分析
2010/08/21 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
小程序云开发实战小结
2018/10/25 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python3实现网络爬虫之BeautifulSoup使用详解
2018/12/19 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
如何通过python实现人脸识别验证
2020/01/17 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python Opencv图像处理基本操作代码详解
2020/08/31 Python
英国汽车和货车租赁网站:Hertz英国
2016/09/02 全球购物
幼儿园教师教育感言
2014/02/28 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
房屋所有权证明
2014/10/20 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
教师先进个人材料
2014/12/17 职场文书
交通事故被告答辩状
2015/05/22 职场文书
遗失证明范文
2015/06/19 职场文书
六一亲子活动感想
2015/08/07 职场文书