PHP-блокирующие и неблокирующие механизмы блокировки, встроенные решения для устранения проблем с повторным выполнением при параллельной блокировке. В настоящее время поддерживается работа с файлами, Redis, Memcache и Memcached.
Добавьте следующее содержимое в файл 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
{
// Неудача при получении блокировки
}
<?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 )