format('Y-m-d'); if ($method === 'GET') { $daily = []; if (file_exists($dailyPath)) { $rawDaily = @file_get_contents($dailyPath); $decoded = json_decode($rawDaily, true); if (is_array($decoded)) { $daily = $decoded; } } $keys = array_keys($daily); sort($keys); $last7 = array_slice($keys, max(0, count($keys) - 7)); $out = []; foreach ($last7 as $k) { $out[$k] = $daily[$k]; } $todayData = $daily[$today] ?? ['visits' => 0, 'video_plays' => 0, 'picture_shows' => 0, 'uv' => 0, 'bandwidth_in' => 0, 'bandwidth_out' => 0]; $total = ['visits' => 0, 'video_plays' => 0, 'picture_shows' => 0, 'uv' => 0, 'bandwidth_in' => 0, 'bandwidth_out' => 0]; foreach ($daily as $d) { if (!is_array($d)) continue; $total['visits'] += intval($d['visits'] ?? 0); $total['video_plays'] += intval($d['video_plays'] ?? 0); $total['picture_shows'] += intval($d['picture_shows'] ?? 0); $total['bandwidth_in'] += intval($d['bandwidth_in'] ?? 0); $total['bandwidth_out'] += intval($d['bandwidth_out'] ?? 0); } // 累计唯一访客:合并所有 uv/.json 的 IP $ips = []; if (is_dir($uvRoot)) { $list = @scandir($uvRoot) ?: []; foreach ($list as $f) { if ($f === '.' || $f === '..') continue; $p = $uvRoot . DIRECTORY_SEPARATOR . $f; if (!is_file($p)) continue; $rawIps = @file_get_contents($p); $decodedIps = json_decode($rawIps, true); if (is_array($decodedIps)) { foreach ($decodedIps as $ip) { if (is_string($ip)) { $ips[$ip] = true; } } } } } $total['uv'] = count($ips); echo json_encode(['success' => true, 'today' => $todayData, 'total' => $total, 'daily' => $out], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } $raw = file_get_contents('php://input'); $data = json_decode($raw, true); $event = isset($data['event']) ? trim((string)$data['event']) : ''; $page = isset($data['page']) ? trim((string)$data['page']) : ''; $url = isset($data['url']) ? trim((string)$data['url']) : ''; $title = isset($data['title']) ? trim((string)$data['title']) : ''; $allowed = ['visit','video_play','picture_show','bandwidth']; if (!in_array($event, $allowed, true)) { echo json_encode(['success' => false, 'message' => 'invalid event']); exit; } $daily = []; if (file_exists($dailyPath)) { $rawDaily = @file_get_contents($dailyPath); $decoded = json_decode($rawDaily, true); if (is_array($decoded)) { $daily = $decoded; } } if (!isset($daily[$today]) || !is_array($daily[$today])) { $daily[$today] = ['visits' => 0, 'video_plays' => 0, 'picture_shows' => 0, 'uv' => 0, 'bandwidth_in' => 0, 'bandwidth_out' => 0]; } if ($event === 'visit') { $daily[$today]['visits']++; } if ($event === 'video_play') { $daily[$today]['video_plays']++; } if ($event === 'picture_show') { $daily[$today]['picture_shows']++; } if ($event === 'visit') { $uvPath = $uvRoot . '/' . $today . '.json'; $ips = []; if (file_exists($uvPath)) { $rawIps = @file_get_contents($uvPath); $decodedIps = json_decode($rawIps, true); if (is_array($decodedIps)) { $ips = $decodedIps; } } $ip = $_SERVER['REMOTE_ADDR'] ?? ''; if ($ip !== '') { if (!in_array($ip, $ips, true)) { $ips[] = $ip; } } @file_put_contents($uvPath, json_encode($ips, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), LOCK_EX); $daily[$today]['uv'] = count($ips); } @file_put_contents($dailyPath, json_encode($daily, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX); $eventsPath = $eventsRoot . '/' . $today . '.json'; $events = []; if (file_exists($eventsPath)) { $rawEvents = @file_get_contents($eventsPath); $decoded = json_decode($rawEvents, true); if (is_array($decoded)) { $events = $decoded; } } $events[] = [ 'type' => $event, 'page' => $page, 'url' => $url, 'title' => $title, 'direction' => $direction ?? '', 'bytes' => $bytes ?? 0, 'ip' => $_SERVER['REMOTE_ADDR'] ?? '', 'ua' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'ts' => (new DateTime('now'))->format(DateTime::ATOM), ]; @file_put_contents($eventsPath, json_encode($events, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX); // 计算累计总数并返回 $total = ['visits' => 0, 'video_plays' => 0, 'picture_shows' => 0, 'uv' => 0, 'bandwidth_in' => 0, 'bandwidth_out' => 0]; if (file_exists($dailyPath)) { $rawDaily = @file_get_contents($dailyPath); $decoded = json_decode($rawDaily, true); if (is_array($decoded)) { foreach ($decoded as $d) { if (!is_array($d)) continue; $total['visits'] += intval($d['visits'] ?? 0); $total['video_plays'] += intval($d['video_plays'] ?? 0); $total['picture_shows'] += intval($d['picture_shows'] ?? 0); $total['bandwidth_in'] += intval($d['bandwidth_in'] ?? 0); $total['bandwidth_out'] += intval($d['bandwidth_out'] ?? 0); } } } // 累计 UV $ips = []; if (is_dir($uvRoot)) { $list = @scandir($uvRoot) ?: []; foreach ($list as $f) { if ($f === '.' || $f === '..') continue; $p = $uvRoot . DIRECTORY_SEPARATOR . $f; if (!is_file($p)) continue; $rawIps = @file_get_contents($p); $decodedIps = json_decode($rawIps, true); if (is_array($decodedIps)) { foreach ($decodedIps as $ip) { if (is_string($ip)) { $ips[$ip] = true; } } } } } $total['uv'] = count($ips); echo json_encode(['success' => true, 'today' => $daily[$today], 'total' => $total], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); $direction = isset($data['direction']) ? (string)$data['direction'] : ''; $bytes = isset($data['bytes']) ? intval($data['bytes']) : 0; if ($event === 'bandwidth' && $bytes > 0) { if ($direction === 'in') { $daily[$today]['bandwidth_in'] += $bytes; } else if ($direction === 'out') { $daily[$today]['bandwidth_out'] += $bytes; } }