YurunLockPHP阻塞鎖和非阻塞鎖機制
YurunLock
PHP阻塞鎖和非阻塞鎖機制,內置解決并發(fā)鎖重復執(zhí)行的方案。目前支持文件、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(); // 解鎖
// 帶回調的阻塞鎖,防止并發(fā)鎖處理重復執(zhí)行
result = $lock->lock(
function(){
// TODO:在這里做你的加鎖后處理的任務
},
function(){
// 判斷是否其它并發(fā)已經(jīng)處理過任務
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(); // 解鎖
// 帶回調的阻塞鎖,防止并發(fā)鎖處理重復執(zhí)行
result = $lock->lock(
function(){
// TODO:在這里做你的加鎖后處理的任務
},
function(){
// 判斷是否其它并發(fā)已經(jīng)處理過任務
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。可以防止重復實例化對象,造成內存和網(wǎng)絡負擔。
// 文件
$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();評論
圖片
表情
