当前位置:首页 > 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实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 //…

php实现定时任务

php实现定时任务

PHP 实现定时任务的几种方法 在 PHP 中实现定时任务可以通过多种方式完成,具体选择取决于项目需求和服务器环境。以下是常见的实现方法: 使用 Cron 任务 Cron 是 Linux 系统中常…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form actio…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…