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实现ping
Oct 09 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
Nov 07 PHP
PHP基础知识介绍
Sep 17 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
PHP实现视频文件上传完整实例
Aug 28 PHP
php验证session无效的解决方法
Nov 04 PHP
ThinkPHP框架设计及扩展详解
Nov 25 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
May 30 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
PHP实现简单用户登录界面
Oct 23 PHP
php适配器模式简单应用示例
Oct 23 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中英混合字符串截取函数代码
2011/07/17 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP判断JSON对象是否存在的方法(推荐)
2016/07/06 PHP
php-msf源码详解
2017/12/25 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
IE8 下的Js错误HTML Parsing Error...
2009/08/14 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
Windows安装Node.js报错:2503、2502的解决方法
2017/10/25 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
简述vue路由打开一个新的窗口的方法
2018/11/29 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
发布你的Python模块详解
2016/09/15 Python
python 计算文件的md5值实例
2017/01/13 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
Python引用计数操作示例
2018/08/23 Python
python制作图片缩略图
2019/04/30 Python
python3 深浅copy对比详解
2019/08/12 Python
Python的垃圾回收机制详解
2019/08/28 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
职工运动会感言
2014/02/07 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
目标责任书格式范文
2015/05/11 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
公司员工离职感言
2015/08/03 职场文书
小学主题班会教案
2015/08/17 职场文书