PHP中使用Memache作为进程锁的操作类分享
程序员文章站
2022-05-12 12:53:44
<?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中使用Memache作为进程锁的操作类分享
-
PHP中使用Memache作为进程锁的操作类分享_PHP教程
-
PHP中使用Memache作为进程锁的操作类分享,phpmemache_PHP教程
-
PHP中使用Memache作为进程锁的操作类分享
-
PHP中使用Memache作为进程锁的操作类分享
-
PHP中使用Memache作为进程锁的操作类分享_PHP
-
PHP中使用Memache作为进程锁的操作类分享_PHP
-
PHP中使用Memache作为进程锁的操作类分享_php技巧
-
PHP中使用Memache作为进程锁的操作类分享,phpmemache
-
PHP中使用Memache作为进程锁的操作类分享_php技巧