]> git.mxchange.org Git - friendica.git/blob - src/Core/Lock/SemaphoreLockDriver.php
93911a3d10207e80a58113e76865566d04221245
[friendica.git] / src / Core / Lock / SemaphoreLockDriver.php
1 <?php
2
3 namespace Friendica\Core\Lock;
4
5 class SemaphoreLockDriver implements ILockDriver
6 {
7         /**
8          * @var array stored semaphores
9          */
10         private static $semaphore = [];
11
12         /**
13          * @brief Creates a semaphore key
14          *
15          * @param string $key Name of the lock
16          *
17          * @return integer the semaphore key
18          */
19         private static function semaphoreKey($key)
20         {
21                 $temp = get_temppath();
22
23                 $file = $temp.'/'.$key.'.sem';
24
25                 if (!file_exists($file)) {
26                         file_put_contents($file, $key);
27                 }
28
29                 return ftok($file, 'f');
30         }
31
32         /**
33          *
34          * @brief Sets a lock for a given name
35          *
36          * @param string $key The Name of the lock
37          * @param integer $timeout Seconds until we give up
38          *
39          * @return boolean Was the lock successful?
40          */
41         public function acquireLock($key, $timeout = 120)
42         {
43                 // The second parameter for "sem_acquire" doesn't exist before 5.6.1
44                 if (function_exists('sem_get') && version_compare(PHP_VERSION, '5.6.1', '>=')) {
45                         self::$semaphore[$key] = sem_get(self::semaphoreKey($key));
46                         if (self::$semaphore[$key]) {
47                                 return sem_acquire(self::$semaphore[$key], ($timeout == 0));
48                         }
49                 }
50         }
51
52         /**
53          * @brief Removes a lock if it was set by us
54          *
55          * @param string $key Name of the lock
56          *
57          * @return mixed
58          */
59         public function releaseLock($key)
60         {
61                 if (function_exists('sem_get') && version_compare(PHP_VERSION, '5.6.1', '>=')) {
62                         if (empty(self::$semaphore[$key])) {
63                                 return false;
64                         } else {
65                                 $success = @sem_release(self::$semaphore[$key]);
66                                 unset(self::$semaphore[$key]);
67                                 return $success;
68                         }
69                 }
70         }
71
72         /**
73          * @brief Removes all lock that were set by us
74          *
75          * @return void
76          */
77         public function releaseAll()
78         {
79                 // not needed/supported
80                 return;
81         }
82 }