Redis Mutex
Distributed mutual exclusion built upon the Amp concurrency framework and Redis., (*1)
Basic Example
$mutex = new Mutex(...);
// ...
try {
$token = bin2hex(random_bytes(16));
yield $mutex->lock($sessionId, $token);
// Code here will only be executed in one client at a time.
// If it takes longer than your specified TTL, you have to
// renew the lock, see next example.
yield $mutex->unlock($sessionId, $token);
} catch (MutexException $e) {
// ...
}
Renew Example
$mutex = new Mutex(...);
$locks = [];
Loop::repeat(1000, function () use ($mutex, $locks) {
foreach ($locks as $id => $token) {
$mutex->renew($id, $token);
}
});
// ...
try {
$token = bin2hex(random_bytes(16));
yield $mutex->lock($sessionId, $token);
$locks[$sessionId] = $token;
// Code here will only be executed in one client at a time.
// Your lock will automatically be renewed by the reactor
// repeat above. Don't do blocking things here (you should never
// do that with Amp anyway), otherwise the reactor will not
// be able to schedule the renewal.
unset($locks[$sessionId]);
yield $mutex->unlock($sessionId, $token);
} catch (MutexException $e) {
// ...
}