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 09 PHP
PHP 和 XML: 使用expat函数(三)
Oct 09 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
50个PHP程序性能优化的方法
Jun 02 PHP
php实现设计模式中的单例模式详解
Oct 11 PHP
php递归调用删除数组空值元素的方法
Apr 28 PHP
PHP如何将log信息写入服务器中的log文件
Jul 29 PHP
php实现的一段简单概率相关代码
May 30 PHP
Thinkphp5.0框架视图view的模板布局用法分析
Oct 12 PHP
php解析非标准json、非规范json的方式实例
May 10 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递归调用的小技巧讲解
2013/02/19 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
2016/03/22 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
php面向对象重点知识分享
2019/09/27 PHP
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
python 实现线程之间的通信示例
2020/02/14 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Python绘制组合图的示例
2020/09/18 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
10分钟理解CSS3 Grid布局
2018/12/20 HTML / CSS
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
表彰先进集体通报
2014/01/12 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
工程质量月活动方案
2014/02/19 职场文书
《新型玻璃》教学反思
2014/04/13 职场文书
爱国演讲稿400字
2014/05/07 职场文书
工程售后服务方案
2014/06/08 职场文书
仲裁协议书
2014/09/26 职场文书
冰峪沟导游词
2015/02/09 职场文书
2019思想汇报范文
2019/05/21 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
解决vue中provide inject的响应式监听
2022/04/19 Vue.js