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和ACCESS写聊天室(七)
Oct 09 PHP
PHP 5.0对象模型深度探索之属性和方法
Mar 27 PHP
php define的第二个参数使用方法
Nov 04 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
PHP XML和数组互相转换详解
Oct 26 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
php+iframe 实现上传文件功能示例
Mar 04 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
php判断IP地址是否在多个IP段内
Aug 18 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语法(4)
2006/10/09 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
destoon各类调用汇总
2014/06/20 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
PHP7 其他修改
2021/03/09 PHP
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
javascript显示中文日期的方法
2015/06/18 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
Python时间获取及转换知识汇总
2017/01/11 Python
python 函数传参之传值还是传引用的分析
2017/09/07 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Django实现文件上传和下载功能
2019/10/06 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
高级工程师岗位职责
2013/12/15 职场文书
公益活动策划方案
2014/01/09 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
社区服务活动报告
2015/02/05 职场文书
同意落户证明
2015/06/19 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP