Using Memache as a process lock Class lock_processlock{ The prefix of key protected $sLockKeyPre; Retry Interval protected $iLockRetryInterval; Retry Count protected $iLockRetryCount; Expiration time of the lock protected $iLockCacheTimeout; callback function after the lock expires protected $onLockTimeoutFunc; Examples of Memache protected $oMemcache; Number of retries after storage Memcache failed 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) { If the lock is unsuccessful, the callback function is called, and if there is no callback function, use the $onLockTimeoutFunc = ' onlocktimeout '; } $this->onlocktimeoutfunc = $onLockTimeoutFunc; } /** Connecting Memcache servers */ Public Function connect () { if (! isset ($this->omemcache)) { $this->omemcache = new Memcache (); $this->omemcache->connect (' 127.0.0.1 ', 11211); } return $this->omemcache; } /* Add key to Memcache */ Public Addmemcache ($sKey, $sValue, $iTimeout) { for ($i = 0; $i < $this->imemcacheretrycount) { $bRes = $this->omemcache->add ($sKey, $sValue, $iTimeout); if ($bRes) { return true; } If the lock does not succeed, after sleep, the new lock Usleep ($this->ilockretryinterval*1000); } return false; } /* Locking */ Public function Lock ($sLockID) { $oMemcache = $this->connect (); $sKey = $this->slockkeypre. $sLockID; If you don't succeed, you can try a few more times. for ($i = 0; $i < $this->ilockretrycount; $i + +) { The value set here can be set arbitrarily if ($this->addmemcache ($sKey, ' 1 ', $this->ilockcachetimeout)) { return true; } If the lock does not succeed, after sleep, the new lock Usleep ($this->ilockretryinterval*1000); } If unsuccessful, the lock fails, calling the callback function, which is the action to be processed after the failure. if (is_callable ($this->onlocktimeoutfunc)) { Calling functions Call_user_func ($this->onlocktimeoutfunc); } } /* Unlock action */ Public function Unlock ($sLockID) { $oMemcache = $this->connect (); $sKey = $this->slockkeypre. $sLockID; Delete key return $this->omemcache->delete ($sKey); } /** If the lock does not succeed, do the following: */ Public Function Onlocktimeout () { Echo ("Lock timeout"); } } Application examples $oLock = new Lock_processlock (); $lockResource = "Test"; Locking $oLock->lock ($lockResource); Unlock |