From d7e7d248cbe41cd7a9ef9c2fb022b6c4831f99a3 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 31 May 2026 15:22:56 +0000
Subject: [PATCH] =jakevan complete
---
inc/managers/queue/Locker.php | 45 ++++++++++++++++++---------------------------
1 files changed, 18 insertions(+), 27 deletions(-)
diff --git a/inc/managers/queue/Locker.php b/inc/managers/queue/Locker.php
index 132b986..4d4b5d6 100644
--- a/inc/managers/queue/Locker.php
+++ b/inc/managers/queue/Locker.php
@@ -1,53 +1,44 @@
<?php
namespace JVBase\managers\queue;
-use wpdb;
if (!defined('ABSPATH')) {
exit;
}
-
class Locker
{
private string $lockKey;
private int $timeout;
- protected wpdb $wpdb;
private ?string $token = null;
- public function __construct(string $key = 'queue', int $timeout = 0)
+ public function __construct(string $key = 'queue', int $timeout = 60)
{
$this->lockKey = BASE . $key . '_lock';
$this->timeout = $timeout;
- global $wpdb;
- $this->wpdb = $wpdb;
}
- /**
- * Execute callback with lock, auto-release after
- */
public function withLock(callable $callback): void
{
- $acquired = $this->wpdb->get_var(
- $this->wpdb->prepare(
- 'SELECT GET_LOCK(%s, %d)',
- $this->lockKey,
- $this->timeout
- )
- );
-
- if ((int) $acquired !== 1) {
- // Lock already held — just exit quietly
- return;
- }
+ if (!$this->acquire()) return;
try {
$callback();
} finally {
- $this->wpdb->get_var(
- $this->wpdb->prepare(
- 'SELECT RELEASE_LOCK(%s)',
- $this->lockKey
- )
- );
+ $this->unlock();
}
}
+
+ private function acquire(): bool
+ {
+ $this->token = bin2hex(random_bytes(8));
+ return (bool) wp_cache_add($this->lockKey, $this->token, 'locks', $this->timeout);
+ }
+
+ public function unlock(): void
+ {
+ $current = wp_cache_get($this->lockKey, 'locks');
+ if ($current === $this->token) {
+ wp_cache_delete($this->lockKey, 'locks');
+ }
+ $this->token = null;
+ }
}
--
Gitblit v1.10.0