markAcquire($key); return true; } } return false; } /** * (@inheritdoc) */ public function releaseLock($key, $override = false) { $success = false; if (!empty(self::$semaphore[$key])) { try { $success = @sem_release(self::$semaphore[$key]); if (file_exists(self::keyToFile($key)) && $success) { $success = unlink(self::keyToFile($key)); } unset(self::$semaphore[$key]); $this->markRelease($key); } catch (\Exception $exception) { $success = false; } } else if ($override) { if ($this->acquireLock($key)) { $success = $this->releaseLock($key, true); } } return $success; } /** * (@inheritdoc) */ public function isLocked($key) { return isset(self::$semaphore[$key]); } /** * {@inheritDoc} */ public function getName() { return self::TYPE_SEMAPHORE; } /** * {@inheritDoc} */ public function getLocks(string $prefix = '') { $temp = get_temppath(); $locks = []; foreach (glob(sprintf('%s/%s*.sem', $temp, $prefix)) as $lock) { $lock = pathinfo($lock, PATHINFO_FILENAME); if(sem_get(self::semaphoreKey($lock))) { $locks[] = $lock; } } return $locks; } /** * {@inheritDoc} */ public function releaseAll($override = false) { $success = parent::releaseAll($override); $temp = get_temppath(); foreach (glob(sprintf('%s/*.sem', $temp)) as $lock) { $lock = pathinfo($lock, PATHINFO_FILENAME); if (!$this->releaseLock($lock, true)) { $success = false; } } return $success; } }