|
@@ -47,8 +47,8 @@ class Channel
|
|
|
// 优先级排序
|
|
// 优先级排序
|
|
|
usort($channels, fn($a, $b) => $a['sort'] <=> $b['sort']);
|
|
usort($channels, fn($a, $b) => $a['sort'] <=> $b['sort']);
|
|
|
|
|
|
|
|
- // 取当前优先级
|
|
|
|
|
- $candidate = $this->filterByPriority($channels);
|
|
|
|
|
|
|
+ // 取当前可用优先级
|
|
|
|
|
+ $candidate = $this->filterByPriorityWithLimit($channels);
|
|
|
if (!$candidate) return false;
|
|
if (!$candidate) return false;
|
|
|
|
|
|
|
|
// Least-Used 调度
|
|
// Least-Used 调度
|
|
@@ -146,20 +146,42 @@ class Channel
|
|
|
* 同优先级过滤
|
|
* 同优先级过滤
|
|
|
* ===============================
|
|
* ===============================
|
|
|
*/
|
|
*/
|
|
|
- private function filterByPriority($channels)
|
|
|
|
|
|
|
+ private function filterByPriorityWithLimit($channels)
|
|
|
{
|
|
{
|
|
|
- $priority = $channels[0]['sort'];
|
|
|
|
|
- $res = [];
|
|
|
|
|
|
|
+ if (!$channels) {
|
|
|
|
|
+ return [];
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- foreach ($channels as $c) {
|
|
|
|
|
- if ($c['sort'] == $priority) {
|
|
|
|
|
- $res[] = $c;
|
|
|
|
|
- } else {
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ $groups = [];
|
|
|
|
|
+ foreach ($channels as $channel) {
|
|
|
|
|
+ $groups[$channel['sort']][] = $channel;
|
|
|
|
|
+ }
|
|
|
|
|
+ ksort($groups);
|
|
|
|
|
+
|
|
|
|
|
+ $redis = Redis::connect();
|
|
|
|
|
+ $now = time();
|
|
|
|
|
+
|
|
|
|
|
+ foreach ($groups as $priority => $list) {
|
|
|
|
|
+ $available = [];
|
|
|
|
|
+ foreach ($list as $c) {
|
|
|
|
|
+ $limit = (float)($c['limit_sec'] ?? 0);
|
|
|
|
|
+ if ($limit <= 0) {
|
|
|
|
|
+ $available[] = $c;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ $lastUsed = (int)$redis->get("channel_last_used:{$c['id']}");
|
|
|
|
|
+ if (!$lastUsed || ($now - $lastUsed) >= $limit) {
|
|
|
|
|
+ $available[] = $c;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($available) {
|
|
|
|
|
+ return $available;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return $res;
|
|
|
|
|
|
|
+ // 没有可用渠道时,降级使用最高优先级(保持与旧逻辑一致)
|
|
|
|
|
+ $firstGroup = reset($groups);
|
|
|
|
|
+ return $firstGroup ? array_values($firstGroup) : [];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|