林琦海 5 ani în urmă
părinte
comite
2c629893c4
1 a modificat fișierele cu 22 adăugiri și 14 ștergeri
  1. 22 14
      common/components/util.php

+ 22 - 14
common/components/util.php

@@ -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;
     }
 
     /**