123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <?php
- namespace Illuminate\Cache;
- use Illuminate\Contracts\Cache\Lock as LockContract;
- use Illuminate\Contracts\Cache\LockTimeoutException;
- use Illuminate\Support\InteractsWithTime;
- use Illuminate\Support\Sleep;
- use Illuminate\Support\Str;
- abstract class Lock implements LockContract
- {
- use InteractsWithTime;
- /**
- * The name of the lock.
- *
- * @var string
- */
- protected $name;
- /**
- * The number of seconds the lock should be maintained.
- *
- * @var int
- */
- protected $seconds;
- /**
- * The scope identifier of this lock.
- *
- * @var string
- */
- protected $owner;
- /**
- * The number of milliseconds to wait before re-attempting to acquire a lock while blocking.
- *
- * @var int
- */
- protected $sleepMilliseconds = 250;
- /**
- * Create a new lock instance.
- *
- * @param string $name
- * @param int $seconds
- * @param string|null $owner
- * @return void
- */
- public function __construct($name, $seconds, $owner = null)
- {
- if (is_null($owner)) {
- $owner = Str::random();
- }
- $this->name = $name;
- $this->owner = $owner;
- $this->seconds = $seconds;
- }
- /**
- * Attempt to acquire the lock.
- *
- * @return bool
- */
- abstract public function acquire();
- /**
- * Release the lock.
- *
- * @return bool
- */
- abstract public function release();
- /**
- * Returns the owner value written into the driver for this lock.
- *
- * @return string
- */
- abstract protected function getCurrentOwner();
- /**
- * Attempt to acquire the lock.
- *
- * @param callable|null $callback
- * @return mixed
- */
- public function get($callback = null)
- {
- $result = $this->acquire();
- if ($result && is_callable($callback)) {
- try {
- return $callback();
- } finally {
- $this->release();
- }
- }
- return $result;
- }
- /**
- * Attempt to acquire the lock for the given number of seconds.
- *
- * @param int $seconds
- * @param callable|null $callback
- * @return mixed
- *
- * @throws \Illuminate\Contracts\Cache\LockTimeoutException
- */
- public function block($seconds, $callback = null)
- {
- $starting = $this->currentTime();
- while (! $this->acquire()) {
- Sleep::usleep($this->sleepMilliseconds * 1000);
- if ($this->currentTime() - $seconds >= $starting) {
- throw new LockTimeoutException;
- }
- }
- if (is_callable($callback)) {
- try {
- return $callback();
- } finally {
- $this->release();
- }
- }
- return true;
- }
- /**
- * Returns the current owner of the lock.
- *
- * @return string
- */
- public function owner()
- {
- return $this->owner;
- }
- /**
- * Determines whether this lock is allowed to release the lock in the driver.
- *
- * @return bool
- */
- public function isOwnedByCurrentProcess()
- {
- return $this->getCurrentOwner() === $this->owner;
- }
- /**
- * Specify the number of milliseconds to sleep in between blocked lock acquisition attempts.
- *
- * @param int $milliseconds
- * @return $this
- */
- public function betweenBlockedAttemptsSleepFor($milliseconds)
- {
- $this->sleepMilliseconds = $milliseconds;
- return $this;
- }
- }
|