stanley-king 4 rokov pred
rodič
commit
bf15cda4e6

+ 6 - 12
helper/refill/policy/chctl.php

@@ -70,6 +70,7 @@ class chctl
             }
         }
 
+        //去掉已经关闭通道
         $usable_items = [];
         foreach ($ctl_items as $item) {
             if($item->opened()) {
@@ -77,6 +78,7 @@ class chctl
             }
         }
 
+        //不过载的排在前面
         $ascending = function ($l, $r) {
             $lproity = $l->priority();
             $rproity = $r->priority();
@@ -100,20 +102,12 @@ class chctl
         usort($usable_items, $ascending);
 
         $result = [];
-        $overload = false;
-        foreach ($usable_items as $item)
-        {
-            if(!$item->speed_overload()) {
-                $result[] = $item->name();
-                $overload = true;
-            }
-        }
-
-        if(count($result) > 0) {
-            $overload = false;
+        foreach ($usable_items as $item) {
+            $name = $item->name();
+            $result[$name] = $item->speed_overload();
         }
 
-        return [$result,$overload];
+        return $result;
     }
 
     private function prefix($name,$spec,$card_type,$quality)

+ 6 - 2
helper/refill/policy/ctl_item.php

@@ -72,12 +72,16 @@ class ctl_item
         return $speed;
     }
 
-    public function speed_overload() : bool {
+    public function speed_overload() : bool
+    {
         if($this->mMaxSpeed < 0) {
             return false;
         }
+        elseif ($this->mMaxSpeed == 0) {
+            return true;
+        }
         else {
-            return $this->cur_speed() > $this->mMaxSpeed;
+            return $this->cur_speed() >= $this->mMaxSpeed;
         }
     }
 

+ 27 - 15
helper/refill/policy/lingzh/policy.php

@@ -44,12 +44,18 @@ class policy extends ProviderManager implements IPolicy
             $names[] = $provider->name();
         }
 
-        [$names,$overload] = $this->mChannelControl->match($names,$spec,$card_type,$quality);
-        Log::record("policy::find_providers match result=" . implode(",",$names),Log::DEBUG);
+        $name_overloads = $this->mChannelControl->match($names,$spec,$card_type,$quality);
+        Log::record("policy::find_providers match result=" . implode(',',$names),Log::DEBUG);
 
         $result = [];
-        foreach ($names as $name)
+        foreach ($name_overloads as $name => $overload)
         {
+            if(!isset($first)) {
+                $first = $overload;
+            }
+
+            if($overload) continue;
+
             foreach ($providers as $provider)
             {
                 if($name == $provider->name()) {
@@ -58,7 +64,11 @@ class policy extends ProviderManager implements IPolicy
             }
         }
 
-        return [$result,$overload];
+        if(!isset($first)) {
+            $first = false;
+        }
+
+        return [$result,$first];
     }
 
     public function price($mchid,$spec,$card_type,$quality)
@@ -81,17 +91,19 @@ class policy extends ProviderManager implements IPolicy
                 continue;
             }
 
-            [$names,$overload] = $this->find_providers($spec,$card_type,$quality);
-            if($overload) {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok",Log::DEBUG);
-                return [$org_quality,$quality];
-            }
-            if(!empty($names)) {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok",Log::DEBUG);
-                return [$org_quality,$quality];
-            }
-            else {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is fail",Log::DEBUG);
+            [$providers,$overload] = $this->find_providers($spec,$card_type,$quality);
+            if (!empty($providers))
+            {
+                if (!$overload) {
+                    Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok", Log::DEBUG);
+                }
+                else {
+                    Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is overload", Log::DEBUG);
+                }
+
+                return [$org_quality, $quality];
+            } else {
+                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is fail", Log::DEBUG);
             }
         }
 

+ 30 - 16
helper/refill/policy/xyz/policy.php

@@ -46,12 +46,18 @@ class policy extends ProviderManager implements IPolicy
             $names[] = $provider->name();
         }
 
-        [$names,$overload] = $this->mChannelControl->match($names,$spec,$card_type,$quality);
+        $name_overloads = $this->mChannelControl->match($names,$spec,$card_type,$quality);
         Log::record("policy::find_providers match result=" . implode(',',$names),Log::DEBUG);
 
         $result = [];
-        foreach ($names as $name)
+        foreach ($name_overloads as $name => $overload)
         {
+            if(!isset($first)) {
+                $first = $overload;
+            }
+
+            if($overload) continue;
+
             foreach ($providers as $provider)
             {
                 if($name == $provider->name()) {
@@ -60,7 +66,11 @@ class policy extends ProviderManager implements IPolicy
             }
         }
 
-        return [$result,$overload];
+        if(!isset($first)) {
+            $first = false;
+        }
+
+        return [$result,$first];
     }
 
     public function price($mchid,$spec,$card_type,$quality)
@@ -78,26 +88,30 @@ class policy extends ProviderManager implements IPolicy
         foreach ($qualities as $quality)
         {
             $price = $this->mPrices->price($mchid,$card_type,$spec,$quality);
-            if($price === false) continue;
-
-            [$names,$overload] = $this->find_providers($spec,$card_type,$quality);
-            if($overload) {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok",Log::DEBUG);
-                return [$org_quality,$quality];
-            }
-            if(!empty($names)) {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok",Log::DEBUG);
-                return [$org_quality,$quality];
+            if($price === false) {
+                Log::record("{$mchid} 没有协商 quality = {$quality} 价格",Log::DEBUG);
+                continue;
             }
-            else {
-                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is fail",Log::DEBUG);
+
+            [$providers,$overload] = $this->find_providers($spec,$card_type,$quality);
+            if (!empty($providers))
+            {
+                if (!$overload) {
+                    Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is ok", Log::DEBUG);
+                }
+                else {
+                    Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is overload", Log::DEBUG);
+                }
+
+                return [$org_quality, $quality];
+            } else {
+                Log::record("Policy::find_quality:{$quality}-{$spec}-{$card_type} is fail", Log::DEBUG);
             }
         }
 
         return [$org_quality,0];
     }
 
-
     public function allow($mchid,$card_type,$amount,$quality) : bool
     {
         $reader = function () {

+ 3 - 3
rdispatcher/proxy.php

@@ -77,9 +77,9 @@ class proxy
                     if($order_id > 0) {
                         $refill_order->edit($order_id, ['is_retrying' => 1]);
                     }
-//                    if(defined('USE_COROUTINE') && USE_COROUTINE) {
-//                        \Swoole\Coroutine::sleep(2);
-//                    }
+                    if(defined('USE_COROUTINE') && USE_COROUTINE && $errcode == refill\errcode::PROVIDER_OVERLOAD) {
+                        \Swoole\Coroutine::sleep(1);
+                    }
                     refill\util::push_add($params);
                 }
             }