denismitr / mutex
PHP Mutex Library
Installs: 7 762
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 2
Forks: 0
Open Issues: 1
Requires
- php: >=7.0.0
Requires (Dev)
- ext-redis: ^2.2.4|^3
- mockery/mockery: ^0.9.9
- php-mock/php-mock: ^2.0.0
- php-mock/php-mock-phpunit: ^2.0
- phpunit/phpunit: ^6.3
- predis/predis: ~1.0
This package is auto-updated.
Last update: 2024-11-23 08:43:05 UTC
README
Author
Installation
composer require denismitr/mutex
Usage
Initialization with factory:
- File lock
$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
- PRedis lock
$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
Using the lock instances
$lock->acquire(); // Do some critical stuff here $lock->release();
With closures
$lock->safe(function() { // Lock will be acuqired and released automatically // Do some critical stuff safely });
Performing a check first
$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
$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(); } });