PHP Mutex Library
Author
Denis Mitrofanov, (*1)
Installation
composer require denismitr/mutex
Usage
Initialization with factory:
- File lock, (*2)
$lock = MutexFactory::fileLock(__FILE__); // or some other file name like /tmp/some-id
- Semaphore lock (linux only)
$lock = MutexFactory::semaphoreLock(__FILE__); // or some other file name like /tmp/some-id
$this->redis = new Client([
'host' => 'localhost',
'port' => 6379,
'database' => 0,
]);
$this->lock = MutexFactory::pRedisLock($this->redis, "some-key", 20);
This far only these types of locks are supported, (*3)
Using the lock instances, (*4)
$lock->acquire();
// Do some critical stuff here
$lock->release();
With closures, (*5)
$lock->safe(function() {
// Lock will be acuqired and released automatically
// Do some critical stuff safely
});
Performing a check first, (*6)
$lock->try(function() use ($room, $from, $to) {
// e.g
return $room->isFree($from, $to);
})->then(function() use ($room, $from, $to) {
// e.g.
// Lock is aquired automatically
$room->book($from, $to);
})->fail(function() use ($user) {
// this callback will fire if the condition in try closure fails
// e.g.
$user->notify("Room is not available for requested time period.");
});
Looping in the safe, locked mode, (*7)
$lock->loop($timeoutInSeconds, function($loop, $i) ($user, $ads) {
// lock is acquired and released automatically when loop is done
// e.g. send out only 10 ads to user friends
// Laravel collections example
$user->friends->each->notify($adds->random());
if ($i >= 10) {
$loop->stop();
}
});