<?php declare(strict_types=1); namespace malkusch\lock\mutex; use RuntimeException; class PgAdvisoryLockMutex extends LockMutex { /** * @var \PDO */ private $pdo; /** * @var int */ private $key1; /** * @var int */ private $key2; /** * @throws \RuntimeException */ public function __construct(\PDO $PDO, string $name) { $this->pdo = $PDO; $hashed_name = hash('sha256', $name, true); if (false === $hashed_name) { // @phpstan-ignore-line throw new RuntimeException('Unable to hash the key, sha256 algorithm is not supported.'); } [$bytes1, $bytes2] = str_split($hashed_name, 4); $this->key1 = unpack('i', $bytes1)[1]; $this->key2 = unpack('i', $bytes2)[1]; } public function lock(): void { $statement = $this->pdo->prepare('SELECT pg_advisory_lock(?,?)'); $statement->execute([ $this->key1, $this->key2, ]); } public function unlock(): void { $statement = $this->pdo->prepare('SELECT pg_advisory_unlock(?,?)'); $statement->execute([ $this->key1, $this->key2 ]); } }