|
@@ -181,6 +181,7 @@ class Channel
|
|
|
'id' => $id,
|
|
'id' => $id,
|
|
|
'used' => (int)$redis->get("channel_usage_counter:$id"),
|
|
'used' => (int)$redis->get("channel_usage_counter:$id"),
|
|
|
'limit_sec' => $c['limit_sec'],
|
|
'limit_sec' => $c['limit_sec'],
|
|
|
|
|
+ 'last_used' => (int)$redis->get("channel_last_used:$id"),
|
|
|
'channel_goods_id' => $c['channel_goods_id'] ?? null,
|
|
'channel_goods_id' => $c['channel_goods_id'] ?? null,
|
|
|
'discount' => $c['discount'] ?? null,
|
|
'discount' => $c['discount'] ?? null,
|
|
|
];
|
|
];
|
|
@@ -190,9 +191,12 @@ class Channel
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 优先选择使用次数最少的渠道,次数相同则优先限速更快的渠道
|
|
|
|
|
|
|
+ // 优先选择使用次数最少的渠道,次数相同则优先限速更快、最近最少使用的渠道
|
|
|
usort($data, function ($a, $b) {
|
|
usort($data, function ($a, $b) {
|
|
|
if ($a['used'] === $b['used']) {
|
|
if ($a['used'] === $b['used']) {
|
|
|
|
|
+ if ($a['limit_sec'] === $b['limit_sec']) {
|
|
|
|
|
+ return $a['last_used'] <=> $b['last_used'];
|
|
|
|
|
+ }
|
|
|
return $a['limit_sec'] <=> $b['limit_sec'];
|
|
return $a['limit_sec'] <=> $b['limit_sec'];
|
|
|
}
|
|
}
|
|
|
return $a['used'] <=> $b['used'];
|
|
return $a['used'] <=> $b['used'];
|
|
@@ -202,6 +206,7 @@ class Channel
|
|
|
|
|
|
|
|
// 计数 +1
|
|
// 计数 +1
|
|
|
$redis->incr("channel_usage_counter:{$selected['id']}");
|
|
$redis->incr("channel_usage_counter:{$selected['id']}");
|
|
|
|
|
+ $redis->set("channel_last_used:{$selected['id']}", time());
|
|
|
|
|
|
|
|
return [
|
|
return [
|
|
|
'channel_id' => $selected['id'],
|
|
'channel_id' => $selected['id'],
|
|
@@ -210,6 +215,22 @@ class Channel
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 启动 Get 服务时重置渠道计数,避免历史状态影响调度
|
|
|
|
|
+ */
|
|
|
|
|
+ public function resetUsageCounters(): void
|
|
|
|
|
+ {
|
|
|
|
|
+ $channels = Dever::db('channel/info')->select(['status' => 1]) ?: [];
|
|
|
|
|
+ if (!$channels) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ $redis = Redis::connect();
|
|
|
|
|
+ foreach ($channels as $channel) {
|
|
|
|
|
+ $redis->del("channel_usage_counter:{$channel['id']}");
|
|
|
|
|
+ $redis->del("channel_last_used:{$channel['id']}");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 渠道主动拉单
|
|
* 渠道主动拉单
|
|
|
* /api/channel/pull
|
|
* /api/channel/pull
|