|
|
@@ -335,30 +335,38 @@ class util
|
|
|
* 获取锁
|
|
|
* @param String $key 锁标识
|
|
|
* @param Int $expire 锁过期时间
|
|
|
- * @param Int $retry 等待次数
|
|
|
+ * @param Int $waitTime 等待时间(超时时间) 秒
|
|
|
* @return Boolean
|
|
|
*/
|
|
|
- public static function lock($key, $expire = 5,$retry = 20)
|
|
|
+ public static function lock($key, $expire = 5,$waitTime = 5)
|
|
|
{
|
|
|
$redis = Yii::$app->redis;
|
|
|
- $is_lock = $redis->setex($key,$expire, time() + $expire);
|
|
|
+ $isLock = $redis->setex($key,$expire, time() + $expire);
|
|
|
+ $time = microtime(true);
|
|
|
+ $exitTime = $waitTime + $time;
|
|
|
// 不能获取锁
|
|
|
- if (!$is_lock) {
|
|
|
+ if (!$isLock) {
|
|
|
// 判断锁是否过期 锁已过期 删除锁 重新获取 防止过期时间设置长,结束时没主动调unlock
|
|
|
- $lock_time = $redis->get($key);
|
|
|
- if($lock_time && time()>$lock_time){
|
|
|
+ $lockTime = $redis->get($key);
|
|
|
+ if($lockTime && time()>$lockTime){
|
|
|
self::unlock($key);
|
|
|
- $is_lock = $redis->setex($key,$expire ,time() + $expire);
|
|
|
+ $isLock = $redis->setex($key,$expire ,time() + $expire);
|
|
|
}
|
|
|
- if(!$is_lock && $retry){
|
|
|
- do {
|
|
|
- $retry -= 1;
|
|
|
- usleep(10000);
|
|
|
- $is_lock = $redis->setex($key,$expire ,time() + $expire);
|
|
|
- } while(!$is_lock && $retry);
|
|
|
+ if(!$isLock){
|
|
|
+ while (true){
|
|
|
+ usleep(50);
|
|
|
+ $isLock = $redis->setex($key,$expire ,time() + $expire);
|
|
|
+ if($isLock){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if( microtime(true) > $exitTime){
|
|
|
+ //超时了
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- return $is_lock ? true : false;
|
|
|
+ return $isLock ? true : false;
|
|
|
}
|
|
|
|
|
|
/**
|