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新手上路(七)
Oct 09 PHP
MySQL GBK→UTF-8编码转换
May 24 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
PHP Try-catch 语句使用技巧
Feb 28 PHP
PHP实现对数组分页处理实例详解
Feb 07 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
PHP RabbitMQ消息列队
May 11 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 URL编码解码函数代码
2009/03/10 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
js中将URL中的参数提取出来作为对象的实现代码
2011/08/16 Javascript
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
2015/08/04 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
jQuery实现别踩白块儿网页版小游戏
2017/01/18 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
Python使用minidom读写xml的方法
2015/06/03 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
对python sklearn one-hot编码详解
2018/07/10 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
工作经常出错的检讨书
2014/09/13 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
债务追讨授权委托书范本
2014/10/16 职场文书
学生检讨书
2015/01/27 职场文书
党支部半年考察意见
2015/06/01 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis