Distributed PHP counting semaphore implementation, using redis as a broker
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
test
.gitignore
LICENSE
README.md
composer.json
composer.lock

README.md

Redis counting semaphore Latest Stable Version Total Downloads License composer.lock

redis-counting-semaphore is a package with a counting semaphore implementation for PHP. It uses redis as a central broker.

Installation

To install redis-counting-semaphore with composer:

composer require code-orange/redis-counting-semaphore

Usage

First, make sure you have a Predis connection instance.

You can create and attempt to obtain a semaphore like so:

<?php
use CodeOrange\RedisCountingSemaphore\Semaphore;

$client = new Predis\Client();

// Create a counting semaphore with a limit of 3
$sem = new Semaphore($client, 'semaphore-name', 3);
if ($sem->acquire(0.1, 10)) {
	// Obtained the semaphore
	use_limited_resource();
	$sem->release();
} else {
	// We weren't able to get a semaphore, even though we tried 10 times
	// And slept for 0.1 seconds in between tries
}

API

/**
 * Semaphore constructor.
 * @param Client $client Predis client with an open connection
 * @param string $name Name of the semaphore
 * @param int $limit The amount of resources this semaphore protects
 * @param int $timeout Timeout of an acquired semaphore, in seconds
 */
public Semaphore(Client $client, $name, $limit = 1, $timeout = 10);

/**
 * Try to acquire a semaphore
 *
 * @param float $sleep Number of seconds to sleep between retries. If null, this function will not retry but return immediately.
 * @param int $retries Number of times to retry before giving up
 * @return bool Whether or not the semaphore was acquired correctly
 */
public function acquire($sleep = null, $retries = null);

/**
 * Release this semaphore
 *
 * @return void
 */
public function release();

/**
 * Refresh the semaphore
 *
 * @return bool Whether or not we still have the semaphore
 */
public function refresh();