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
我的论坛源代码(五)
Oct 09 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
用php来改写404错误页让你的页面更友好
Jan 24 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
PHP实现微信红包金额拆分试玩的算法示例
Apr 07 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
PHP中$GLOBALS与global的区别详解
Mar 21 PHP
PHP判断是否微信访问的方法示例
Mar 27 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
PHP伪造referer实例代码
2008/09/20 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
js操作table示例(个人心得)
2013/11/29 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
JS实现的竖向折叠菜单代码
2015/10/21 Javascript
jQuery多条件筛选如何实现
2015/11/04 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
深入理解node.js之path模块
2017/05/03 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
深入理解React高阶组件
2017/09/28 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
Angular17之Angular自定义指令详解
2018/01/21 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
2019/05/10 Python
Django中modelform组件实例用法总结
2020/02/10 Python
基于Pytorch SSD模型分析
2020/02/18 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
什么是网络协议
2016/04/07 面试题
计算机实训报告总结
2014/11/05 职场文书
2015年党性分析材料
2014/12/19 职场文书
居安思危观后感
2015/06/11 职场文书
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
Android存储中最基本的文件存储方式
2022/04/30 Java/Android