YurunLock
增加支持Redis、Memcache、Memcached登录验证
PHP blocking lock and non-blocking lock mechanisms have built-in solutions to repeated execution of concurrent locks. Currently, it supports files, Redis, Memcache, Memcached.
Add the following content to the composer.json file in your project
{
"require" : {
"yurunsoft/yurun-lock" : " dev-master "
}
}If Chinese users use composer, please check it out: 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
{
// 获取锁失败
}Directly pass the operation object to support files, redis, memcache, memcached. It can prevent repeated instantiation of objects, causing memory and network burden.
// 文件
$ 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 ();