// Use Memache as the process lock Class lock_processlock { // Key prefix Protected $ sLockKeyPre; // Retry interval Protected $ iLockRetryInterval; // Number of retries Protected $ iLockRetryCount; // Lock expiration time Protected $ iLockCacheTimeout; // Callback function after lock expiration Protected $ onLockTimeoutFunc; // Memache instance Protected $ oMemcache; // Number of retries after memcache fails to be stored 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 fails, the callback function is called. If no callback function is available, use $ OnLockTimeoutFunc = 'onlocktimeout '; } $ This-> onLockTimeoutFunc = $ onLockTimeoutFunc; } /** Connect to the memcache server */ Public function connect (){ If (! Isset ($ this-> oMemcache )){ $ This-> oMemcache = new Memcache (); $ This-> oMemcache-> connect ('2017. 0.0.1 ', 127 ); } Return $ this-> oMemcache; } /* Add a 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 fails, apply the new lock after sleep. Usleep ($ this-> iLockRetryInterval * 1000 ); } Return false; } /* Lock */ Public function lock ($ sLockID ){ $ OMemcache = $ this-> connect (); $ SKey = $ this-> sLockKeyPre. $ sLockID; // Try multiple times if the lock fails. For ($ I = 0; $ I <$ this-> iLockRetryCount; $ I ++ ){ // Set the value here. If ($ this-> addMemcache ($ sKey, '1', $ this-> iLockCacheTimeout )){ Return true; } // If the lock fails, apply the new lock after sleep. Usleep ($ this-> iLockRetryInterval * 1000 ); } // If the lock fails, call the callback function, which is the operation to be processed after the lock fails. If (is_callable ($ this-> onLockTimeoutFunc )){ // Call a function Call_user_func ($ this-> onLockTimeoutFunc ); } } /* Unlock operation */ Public function unlock ($ sLockID ){ $ OMemcache = $ this-> connect (); $ SKey = $ this-> sLockKeyPre. $ sLockID; // Delete the key Return $ this-> oMemcache-> delete ($ sKey ); } /** If the lock fails, perform the following operations: */ Public function onLockTimeout (){ Echo ("lock timeout "); } } // Application instance $ OLock = new lock_processlock (); $ LockResource = "test "; // Lock $ OLock-> lock ($ lockResource ); // Unlock |