with('tunnels')->chunk(100, function ($servers) { foreach ($servers as $server) { $tunnels = $server->toArray()['tunnels']; foreach ($tunnels as $host) { $host = Tunnel::with(['user', 'server'])->find($host['id']); $host->load('user'); Log::debug('------------'); Log::debug('主机: ' . $host->name); Log::debug('属于用户: ' . $host->user->name); $cache_key = 'frpTunnel_data_' . $host->client_token; $tunnel_data = Cache::get($cache_key, null); if (!is_null($tunnel_data)) { Log::debug('frpTunnel_data_ 不为空。'); $traffic = ($tunnel_data['today_traffic_in'] ?? 0) + ($tunnel_data['today_traffic_out'] ?? 0); Log::debug('本次使用的流量: ' . round($traffic / 1024 / 1024 / 1024, 2) ?? 0); $day = date('d'); $traffic_key = 'traffic_day_' . $day . '_used_' . $host->id; $used_traffic = Cache::get($traffic_key, 0); if ($used_traffic !== $traffic) { // 保存 2 天 Cache::put($traffic_key, $traffic, 86400); $used_traffic_gb = round($used_traffic / 1024 / 1024 / 1024, 2); Log::debug('上次使用的流量 GB: ' . $used_traffic_gb); $used_traffic = $traffic - $used_traffic; Log::debug('流量差值: ' . round($used_traffic / 1024 / 1024 / 1024, 2) . ' GB'); } $left_traffic = 0; $used_traffic = abs($used_traffic); Log::debug('实际用量:' . $used_traffic / 1024 / 1024 / 1024); if ($used_traffic > 0 && $left_traffic == 0) { Log::debug('此时 used_traffic: ' . $used_traffic); // 要计费的流量 $traffic = round($used_traffic / (1024 * 1024 * 1024), 2) ?? 0; $traffic = abs($traffic); $gb = round($traffic, 2); Log::debug('此时 traffic: ' . $traffic); // lock for update Log::debug('此时 user->traffic: ' . $host->user->traffic); Log::debug('扣除后的流量: ' . $host->user->traffic - $gb); Cache::lock('user_traffic_' . $host->user->id)->get(function () use ($host, $gb) { $host->user->update([ 'traffic' => $host->user->traffic - $gb ]); }); } } } } }); } }