X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FLock.php;h=9892f1f4e4d7e74e2dcab9212da8a09f4943401f;hb=be7bd106784ad4e45833b1649e8409ef48f0d19f;hp=9e02d14fcb585dc06418e50b0e51c64300324396;hpb=2260b9c87375dbdff175f93d0eee5d6f321b9102;p=friendica.git diff --git a/src/Core/Lock.php b/src/Core/Lock.php index 9e02d14fcb..9892f1f4e4 100644 --- a/src/Core/Lock.php +++ b/src/Core/Lock.php @@ -1,18 +1,14 @@ =')) { - self::$driver = new Lock\SemaphoreLockDriver(); - } elseif (Config::get('system', 'cache_driver', 'database') == 'memcache') { - self::$driver = new Lock\MemcacheLockDriver(); - } else { + $lock_driver = Config::get('system', 'lock_driver', 'default'); + + try { + switch ($lock_driver) { + case 'memcache': + case 'memcached': + case 'redis': + $cache_driver = CacheDriverFactory::create($lock_driver); + if ($cache_driver instanceof IMemoryCacheDriver) { + self::$driver = new Lock\CacheLockDriver($cache_driver); + } + break; + + case 'database': self::$driver = new Lock\DatabaseLockDriver(); + break; + + case 'semaphore': + self::$driver = new Lock\SemaphoreLockDriver(); + break; + + default: + self::useAutoDriver(); + } + } catch (\Exception $exception) { + logger ('Driver \'' . $lock_driver . '\' failed - Fallback to \'useAutoDriver()\''); + self::useAutoDriver(); + } + } + + /** + * @brief This method tries to find the best - local - locking method for Friendica + * + * The following sequence will be tried: + * 1. Semaphore Locking + * 2. Cache Locking + * 3. Database Locking + * + */ + private static function useAutoDriver() { + + // 1. Try to use Semaphores for - local - locking + if (function_exists('sem_get')) { + try { + self::$driver = new Lock\SemaphoreLockDriver(); + return; + } catch (\Exception $exception) { + logger ('Using Semaphore driver for locking failed: ' . $exception->getMessage()); + } + } + + // 2. Try to use Cache Locking (don't use the DB-Cache Locking because it works different!) + $cache_driver = Config::get('system', 'cache_driver', 'database'); + if ($cache_driver != 'database') { + try { + $lock_driver = CacheDriverFactory::create($cache_driver); + if ($lock_driver instanceof IMemoryCacheDriver) { + self::$driver = new Lock\CacheLockDriver($lock_driver); } + return; + } catch (\Exception $exception) { + logger('Using Cache driver for locking failed: ' . $exception->getMessage()); + } } + + // 3. Use Database Locking as a Fallback + self::$driver = new Lock\DatabaseLockDriver(); } /** @@ -70,7 +113,7 @@ class Lock * * @return boolean Was the lock successful? */ - public static function acquireLock($key, $timeout = 120) + public static function acquire($key, $timeout = 120) { return self::getDriver()->acquireLock($key, $timeout); } @@ -79,11 +122,11 @@ class Lock * @brief Releases a lock if it was set by us * * @param string $key Name of the lock - * @return mixed + * @return void */ - public static function releaseLock($key) + public static function release($key) { - return self::getDriver()->releaseLock($key); + self::getDriver()->releaseLock($key); } /**