]> git.mxchange.org Git - friendica.git/blob - src/Core/Lock.php
9e02d14fcb585dc06418e50b0e51c64300324396
[friendica.git] / src / Core / Lock.php
1 <?php
2 /**
3  * @file src/Core/Lock.php
4  */
5 namespace Friendica\Util;
6
7 /**
8  * @file src/Core/Lock.php
9  * @brief Functions for preventing parallel execution of functions
10  */
11
12 use Friendica\Core\Config;
13 use Friendica\Core\Lock;
14
15 require_once 'include/dba.php';
16
17 /**
18  * @brief This class contain Functions for preventing parallel execution of functions
19  */
20 class Lock
21 {
22         /**
23          * @var Lock\ILockDriver;
24          */
25         static $driver = null;
26
27         public static function init()
28         {
29                 switch(Config::get('system', 'lock_driver', 'default')) {
30                         case 'memcache':
31                                 self::$driver = new Lock\MemcacheLockDriver();
32                                 break;
33                         case 'database':
34                                 self::$driver = new Lock\DatabaseLockDriver();
35                                 break;
36                         case 'semaphore':
37                                 self::$driver = new Lock\SemaphoreLockDriver();
38                                 break;
39                         default:
40                                 // Determine what's the best/fastest locking driver (default behavior in Friendica)
41                                 if (function_exists('sem_get') && version_compare(PHP_VERSION, '5.6.1', '>=')) {
42                                         self::$driver = new Lock\SemaphoreLockDriver();
43                                 } elseif (Config::get('system', 'cache_driver', 'database') == 'memcache') {
44                                         self::$driver = new Lock\MemcacheLockDriver();
45                                 } else {
46                                         self::$driver = new Lock\DatabaseLockDriver();
47                                 }
48                 }
49         }
50
51         /**
52          * Returns the current cache driver
53          *
54          * @return Lock\ILockDriver;
55          */
56         private static function getDriver()
57         {
58                 if (self::$driver === null) {
59                         self::init();
60                 }
61
62                 return self::$driver;
63         }
64
65         /**
66          * @brief Acquires a lock for a given name
67          *
68          * @param string  $key Name of the lock
69          * @param integer $timeout Seconds until we give up
70          *
71          * @return boolean Was the lock successful?
72          */
73         public static function acquireLock($key, $timeout = 120)
74         {
75                 return self::getDriver()->acquireLock($key, $timeout);
76         }
77
78         /**
79          * @brief Releases a lock if it was set by us
80          *
81          * @param string $key Name of the lock
82          * @return mixed
83          */
84         public static function releaseLock($key)
85         {
86                 return self::getDriver()->releaseLock($key);
87         }
88
89         /**
90          * @brief Releases all lock that were set by us
91          * @return void
92          */
93         public static function releaseAll()
94         {
95                 self::getDriver()->releaseAll();
96         }
97 }