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支持断点续传的源码
May 16 PHP
Session保存到数据库的php类分享
Oct 24 PHP
定义php常量的详解
Jun 09 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
PHP中的output_buffering详细介绍
Sep 27 PHP
php简单操作mysql数据库的类
Apr 16 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
变量在 PHP7 内部的实现(一)
Dec 21 PHP
php技巧小结【推荐】
Jan 19 PHP
CentOS7编译安装php7.1的教程详解
Apr 18 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 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执行速度全攻略(上)
2006/10/09 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
javascript 贪吃蛇实现代码
2008/11/22 Javascript
用按钮控制iframe显示的网页实现方法
2013/02/04 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
js判断鼠标左、中、右键哪个被点击的方法
2015/01/27 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
Html5 js实现手风琴效果
2020/04/17 Javascript
详解VUE 数组更新
2017/12/16 Javascript
vue服务端渲染缓存应用详解
2018/09/12 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
JavaScript实现栈结构Stack过程详解
2020/03/07 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
小程序实现tab标签页
2020/11/16 Javascript
Python算法应用实战之栈详解
2017/02/04 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python学生管理系统开发
2019/01/30 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
python中np是做什么的
2020/07/21 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
运动会口号8字
2014/06/07 职场文书
停车位租赁协议书
2014/09/24 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
写给老婆的保证书
2015/02/27 职场文书
监理中标通知书
2015/04/16 职场文书
漂亮妈妈观后感
2015/06/08 职场文书
趣味运动会标语口号
2015/12/26 职场文书
年终工作总结范文
2019/06/20 职场文书