1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yurunsoft-YurunLock

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

YurunLock

PHP-блокирующие и неблокирующие механизмы блокировки, встроенные решения для устранения проблем с повторным выполнением при параллельной блокировке. В настоящее время поддерживается работа с файлами, Redis, Memcache и Memcached.

Установка через composer

Добавьте следующее содержимое в файл composer.json вашего проекта:

{
    "require": {
        "yurunsoft/yurun-lock": "dev-master"
    }
}

Если у вас возникают проблемы с использованием composer, рекомендуется обратиться к следующему ресурсу: https://pkg.phpcomposer.com/.

Использование кода

Блокировка файла

<?php
$lock = new \Yurun\Until\Lock\File('Я являюсь именем блокировки');

$lock->lock(); // Блокирующая блокировка
// TODO: Выполните здесь некоторые действия
$lock->unlock(); // Разблокировка

// Блокирующая блокировка с обратным вызовом, предотвращающая повторное выполнение при параллельной обработке блокировки
result = $lock->lock(
	function(){
		// TODO: Выполните задачу после получения блокировки здесь

	},
	function(){
		// Проверьте, обработал ли другой параллельный запрос задачу
		return false;
	}
);
switch($result)
{
	case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
		// Другие запросы уже обработаны
		break;
	case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
		// Обработка текущего запроса
		break;
	case LockConst::LOCK_RESULT_FAIL:
		// Ошибка при получении блокировки
		break;
}

// Неблокирующая блокировка, возвращает false при неудачной попытке получить блокировку
if($lock->unblockLock())
{
	// TODO: Выполните некоторые действия здесь
}
else
{
	// Неудача при получении блокировки
}

Блокировки Redis/Memcache/Memcached

<?php
$lock = new \Yurun\Until\Lock\Redis(	// Можно заменить Redis на Memcache или Memcached, использование аналогично
	'Я являюсь именем блокировки',
	array(
		'host'		=>	'127.0.0.1',
		'port'		=>	11211,
		'timeout'	=>	0,
		'pconnect'	=>	false,
	), // Конфигурация соединения, оставьте пустым для использования значений по умолчанию
	0, // Время ожидания при попытке получения блокировки, в миллисекундах, 0 означает отсутствие ограничения, оставить пустым для использования значения по умолчанию
	1, // Интервал между попытками получения блокировки, в миллисекундах, оставить пустым для использования значения по умолчанию
	3, // Время истечения срока блокировки, в секундах, оставить пустым для использования значения по умолчанию
);

$lock->lock(); // Блокирующая блокировка
// TODO: Выполните здесь некоторые действия
$lock->unlock(); // Разблокировка

// Блокирующая блокировка с обратным вызовом, предотвращающая повторное выполнение при параллельной обработке блокировки
result = $lock->lock(
	function(){
		// TODO: Выполните задачу после получения блокировки здесь

	},
	function(){
		// Проверьте, обработал ли другой параллельный запрос задачу
		return false;
	}
);
switch($result)
{
	case LockConst::LOCK_RESULT_CONCURRENT_COMPLETE:
		// Другие запросы уже обработаны
		break;
	case LockConst::LOCK_RESULT_CONCURRENT_UNTREATED:
		// Обработка текущего запроса
		break;
	case LockConst::LOCK_RESULT_FAIL:
		// Ошибка при получении блокировки
		break;
}

// Неблокирующая блокировка, возвращает false при неудачной попытке получить блокировку
if($lock->unblockLock())
{
	// TODO: Выполните некоторые действия здесь
}
else
{
	// Неудача при получении блокировки
}

Передача объекта операции напрямую

Передача объекта операции напрямую поддерживает работу с файлами, redis, memcache и memcached. Это позволяет избежать повторного создания экземпляров объектов и связанных с этим нагрузок на память и сеть.

// Файл
$fp = fopen('1.txt', 'w+');
$lock = new \Yurun\Until\Lock\File('Являюсь именем блокировки', $fp);
$lock->lock();
// Выполняем некоторые действия
$lock->unlock();
fclose($fp);

// Redis, memcache, memcached аналогично
$redis = new \Redis;
$redis->connect($host, $port, $timeout);
$lock = new \Yurun\Until\Lock\Redis('Являюсь именем блокировки', $$redis);
$lock->lock();
// Выполняем некоторые действия
$lock->unlock();
redis->close();

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/yurunsoft-YurunLock.git
git@api.gitlife.ru:oschina-mirror/yurunsoft-YurunLock.git
oschina-mirror
yurunsoft-YurunLock
yurunsoft-YurunLock
master