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入门学习知识点五 关于php数组的几个基本操作
Jul 14 PHP
php打开远程文件的方法和风险及解决方法
Nov 12 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
apache php mysql开发环境安装教程
Jul 28 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
python进程与线程小结实例分析
Nov 11 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
Apr 10 PHP
Laravel框架控制器,视图及模型操作图文详解
Dec 04 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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/04 星际争霸
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
javascript 的Document属性和方法集合
2010/01/25 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
JavaScript常用事件介绍
2019/01/21 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
python正则表达式re模块详解
2014/06/25 Python
python中sleep函数用法实例分析
2015/04/29 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
18岁生日感言
2014/01/12 职场文书
优秀小学生家长评语
2014/01/30 职场文书
老师对学生的寄语
2014/04/09 职场文书
党员服务承诺书
2014/05/28 职场文书
法律专业自荐信
2014/06/03 职场文书
班风口号
2014/06/18 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
为Centos安装指定版本的Docker
2022/04/01 Servers
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技