当前位置:首页 > PHP

php实现日榜周榜月榜

2026-01-29 07:53:11PHP

实现日榜、周榜、月榜的PHP方案

通过时间范围筛选数据并排序,结合数据库查询和缓存机制实现榜单功能。

数据库表设计

假设存储用户得分的表结构如下:

CREATE TABLE user_scores (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    score INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

日榜实现

获取当日0点到当前时间的数据:

php实现日榜周榜月榜

$todayStart = date('Y-m-d 00:00:00');
$todayEnd = date('Y-m-d H:i:s');

$dailyRanking = DB::table('user_scores')
    ->select('user_id', DB::raw('SUM(score) as total_score'))
    ->whereBetween('created_at', [$todayStart, $todayEnd])
    ->groupBy('user_id')
    ->orderByDesc('total_score')
    ->limit(10)
    ->get();

周榜实现

获取本周一0点到当前时间的数据:

$weekStart = date('Y-m-d 00:00:00', strtotime('last Monday'));
$weekEnd = date('Y-m-d H:i:s');

$weeklyRanking = DB::table('user_scores')
    ->select('user_id', DB::raw('SUM(score) as total_score'))
    ->whereBetween('created_at', [$weekStart, $weekEnd])
    ->groupBy('user_id')
    ->orderByDesc('total_score')
    ->limit(10)
    ->get();

月榜实现

获取本月1日0点到当前时间的数据:

php实现日榜周榜月榜

$monthStart = date('Y-m-01 00:00:00');
$monthEnd = date('Y-m-d H:i:s');

$monthlyRanking = DB::table('user_scores')
    ->select('user_id', DB::raw('SUM(score) as total_score'))
    ->whereBetween('created_at', [$monthStart, $monthEnd])
    ->groupBy('user_id')
    ->orderByDesc('total_score')
    ->limit(10)
    ->get();

性能优化方案

使用Redis缓存榜单结果,避免频繁查询数据库:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 日榜缓存键
$dailyKey = 'ranking:daily:' . date('Ymd');
if (!$redis->exists($dailyKey)) {
    // 从数据库获取并存入Redis
    $dailyData = /* 数据库查询逻辑 */;
    $redis->setex($dailyKey, 86400, json_encode($dailyData));
}
$dailyRanking = json_decode($redis->get($dailyKey));

定时任务更新

通过Crontab定时生成榜单:

0 0 * * * /usr/bin/php /path/to/update_daily_ranking.php
0 0 * * 1 /usr/bin/php /path/to/update_weekly_ranking.php
0 0 1 * * /usr/bin/php /path/to/update_monthly_ranking.php

数据结构优化

对于大规模数据,考虑使用专门的结构存储排名:

// Redis有序集合实现实时排名
$redis->zAdd('daily_scores', $score, $user_id);
$dailyTop10 = $redis->zRevRange('daily_scores', 0, 9, true);

以上方案可根据实际业务需求调整时间范围定义和排序规则,缓存过期时间建议设置为对应榜单周期的自然结束时间。

分享给朋友:

相关文章

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php实现进度条

php实现进度条

PHP 实现进度条的方法 使用 HTML 和 CSS 结合 PHP 实现进度条 在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。 <di…

php 实现多继承

php 实现多继承

在PHP中,原生不支持多继承,但可以通过以下几种方法模拟实现类似多继承的功能: 使用 trait Trait是PHP 5.4引入的特性,允许在类中复用代码片段,可以视为一种轻量级的继承机制。一个类可…

php 实现扫码登录

php 实现扫码登录

PHP 实现扫码登录的流程 扫码登录的核心流程分为两部分:前端生成二维码并轮询状态,后端验证扫码状态并返回登录凭证。以下是具体实现方法: 生成唯一二维码 创建临时令牌 在用户访问登录页面时,后端生…

php 实现长轮询

php 实现长轮询

PHP 实现长轮询的方法 长轮询(Long Polling)是一种服务器推送技术,客户端发送请求后,服务器保持连接开放直到有新数据或超时。以下是实现步骤: 基础实现代码 创建一个简单的长轮询 PHP…