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 中的输出缓冲
Dec 21 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
递归实现php数组转xml的代码分享
May 14 PHP
php删除数组中重复元素的方法
Dec 22 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
Mar 15 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP7 其他语言层面的修改
Mar 09 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
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP调用三种数据库的方法(2)
2006/10/09 PHP
SMARTY学习手记
2007/01/04 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
php文件后缀不强制为.php的实操方法
2019/09/18 PHP
DOM 基本方法
2009/07/18 Javascript
用 Javascript 验证表单(form)中多选框(checkbox)值
2009/09/08 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
jQuery动态生成Bootstrap表格
2016/11/01 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python实现井字棋游戏
2020/03/30 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
django修改models重建数据库的操作
2020/03/31 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
党员批评与自我批评发言
2014/10/02 职场文书
逃课检讨书
2015/01/26 职场文书
2015年维修工作总结
2015/04/25 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python