<?php declare(strict_types=1); namespace malkusch\lock\mutex; use Memcached; /** * Memcached based spinlock implementation. * * @author Markus Malkusch <markus@malkusch.de> * @link bitcoin:1P5FAZ4QhXCuwYPnLZdk3PJsqePbu1UDDA Donations * @license WTFPL */ class MemcachedMutex extends SpinlockMutex { /** * @var Memcached The connected Memcached API. */ private $memcache; /** * Sets the lock's name and the connected Memcached API. * * The Memcached API needs to have at least one server in its pool. I.e. * it has to be added with Memcached::addServer(). * * @param string $name The lock name. * @param Memcached $memcache The connected Memcached API. * @param int $timeout The time in seconds a lock expires, default is 3. * * @throws \LengthException The timeout must be greater than 0. */ public function __construct(string $name, Memcached $memcache, int $timeout = 3) { parent::__construct($name, $timeout); $this->memcache = $memcache; } protected function acquire(string $key, int $expire): bool { return $this->memcache->add($key, true, $expire); } protected function release(string $key): bool { return $this->memcache->delete($key); } }