3 * @file src/Util/Lock.php
5 namespace Friendica\Core;
8 * @file src/Core/Lock.php
9 * @brief Functions for preventing parallel execution of functions
12 use Friendica\Core\Cache\CacheDriverFactory;
15 * @brief This class contain Functions for preventing parallel execution of functions
20 * @var Lock\ILockDriver;
22 static $driver = null;
24 public static function init()
26 $lock_driver = Config::get('system', 'lock_driver', 'default');
29 switch ($lock_driver) {
31 $cache_driver = CacheDriverFactory::create('memcache');
32 self::$driver = new Lock\CacheLockDriver($cache_driver);
36 $cache_driver = CacheDriverFactory::create('memcached');
37 self::$driver = new Lock\CacheLockDriver($cache_driver);
41 $cache_driver = CacheDriverFactory::create('redis');
42 self::$driver = new Lock\CacheLockDriver($cache_driver);
46 self::$driver = new Lock\DatabaseLockDriver();
50 self::$driver = new Lock\SemaphoreLockDriver();
54 self::useAutoDriver();
56 } catch (\Exception $exception) {
57 logger ('Driver \'' . $lock_driver . '\' failed - Fallback to \'useAutoDriver()\'');
58 self::useAutoDriver();
63 * @brief This method tries to find the best - local - locking method for Friendica
65 * The following sequence will be tried:
66 * 1. Semaphore Locking
71 private static function useAutoDriver() {
73 // 1. Try to use Semaphores for - local - locking
74 if (function_exists('sem_get')) {
76 self::$driver = new Lock\SemaphoreLockDriver();
78 } catch (\Exception $exception) {
79 logger ('Using Semaphore driver for locking failed: ' . $exception->getMessage());
83 // 2. Try to use Cache Locking (don't use the DB-Cache Locking because it works different!)
84 $cache_driver = Config::get('system', 'cache_driver', 'database');
85 if ($cache_driver != 'database') {
87 $lock_driver = CacheDriverFactory::create($cache_driver);
88 self::$driver = new Lock\CacheLockDriver($lock_driver);
90 } catch (\Exception $exception) {
91 logger('Using Cache driver for locking failed: ' . $exception->getMessage());
95 // 3. Use Database Locking as a Fallback
96 self::$driver = new Lock\DatabaseLockDriver();
100 * Returns the current cache driver
102 * @return Lock\ILockDriver;
104 private static function getDriver()
106 if (self::$driver === null) {
110 return self::$driver;
114 * @brief Acquires a lock for a given name
116 * @param string $key Name of the lock
117 * @param integer $timeout Seconds until we give up
119 * @return boolean Was the lock successful?
121 public static function acquireLock($key, $timeout = 120)
123 return self::getDriver()->acquireLock($key, $timeout);
127 * @brief Releases a lock if it was set by us
129 * @param string $key Name of the lock
132 public static function releaseLock($key)
134 return self::getDriver()->releaseLock($key);
138 * @brief Releases all lock that were set by us
141 public static function releaseAll()
143 self::getDriver()->releaseAll();