资讯专栏INFORMATION COLUMN

php定时执行任务(定时删除用户过期积分)

endiat / 1333人阅读

摘要:最近网站实行用户积分过期制度,只保留用户近三月积分,三月前未使用积分进行扣除平台用户量比较大,感觉这样做会出问题,有没有好的解决方法服务器代码如下近三月使用积分扣除用户过期积分添加过期积分扣除日志总过期积分过期积分未消费完应扣

最近网站实行用户积分过期制度,只保留用户近三月积分,三月前未使用积分进行扣除
*平台用户量比较大,感觉这样做会出问题,有没有好的解决方法?(windows iis服务器)
代码如下:

ignore_user_abort(); 
set_time_limit(0); 
do{
    $this->del_score();
    sleep(24*3600);
}while (true);

private function del_score()
{
    $date = to_date(to_timespan(to_date(TIME_UTC)." -3 month"),"Y-m-d");
    
    // 近三月使用积分
    $user_scores = $GLOBALS["db"]->getAll("SELECT user_id,sum(score) as score FROM ".DB_PREFIX."user_score_log WHERE score<0 AND create_time_ymd > "".$date."" GROUP BY user_id");
    
    // 扣除用户过期积分
    $update_sql = "UPDATE ".DB_PREFIX."user SET score = score - CASE id ";

    // 添加过期积分扣除日志
    $insert_sql = "INSERT INTO ".DB_PREFIX."user (`user_id`, `score`, `account_score`, `mome`, `type`, `create_time`, `create_time_ymd`, `create_time_ym`, `create_time_y`) VALUES ";

    foreach ($user_scores as $k => $v) {
        // 总过期积分
        $old_account_score = $GLOBALS["db"]->getOne("SELECT account_score FROM ".DB_PREFIX."user_score_log WHERE user_id=".$v["user_id"]." AND create_time_ymd<=".$date." ORDER BY id DESC LIMIT 1");
        if($old_account_score > abs($v["score"])) // 过期积分未消费完
        {
            $arr[$v["user_id"]] = $v["score"];

            // 应扣除积分
            $score = intval($account_score - abs($v["score"]));
            $update_sql .= sprintf("WHEN %d THEN %d ", $v["user_id"], $score);

            // 账户现有积分
            $account_score = $GLOBALS["db"]->getOne("SELECT score - {$score} FROM ".DB_PREFIX."user WHERE id=".$v["user_id"]);
            $create_time = TIME_UTC;
            $create_time_ymd = to_date(TIME_UTC,"Y-m-d");
            $create_time_ym = to_date(TIME_UTC,"Ym");
            $create_time_y = to_date(TIME_UTC,"Y");
            $insert_sql .= "(".$v["user_id"].",-".$score.",".$account_score.","积分到期未使用部分扣除",26,".$create_time.","".$create_time_ymd."","".$create_time_ym."","".$create_time_y.""),";
        }
        continue; 
    }
    $ids = implode(",", array_keys($arr)); 
    $update_sql .= " END WHERE id IN ($ids)";
    $insert_sql = substr($insert_sql, 0, -1);
    $GLOBALS["db"]->query($update_sql);
    $GLOBALS["db"]->query($insert_sql);
} 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22116.html

相关文章

  • 定时器在大型web项目中的应用和实现

    摘要:在软件项目中,定时器也被应用到了各方各面,本文将从项目入手,讲述定时器,本文的例子都以为例。定时器总类定时器有两种对应重复任务和一次性任务。 在大规模分布式系统中,每个业务都可能是集群,每个业务机都会产生定时任务,不同的业务会有不同的任务管理需求,统一的任务调度和管理变得非常有必要。 定时如何准确,大量的定时被同时触发怎么办? 定时结束的时候,怎么通知业务机去处理呢? 某台业务机下线...

    douzifly 评论0 收藏0
  • 定时器在大型web项目中的应用和实现

    摘要:在软件项目中,定时器也被应用到了各方各面,本文将从项目入手,讲述定时器,本文的例子都以为例。定时器总类定时器有两种对应重复任务和一次性任务。 在大规模分布式系统中,每个业务都可能是集群,每个业务机都会产生定时任务,不同的业务会有不同的任务管理需求,统一的任务调度和管理变得非常有必要。 定时如何准确,大量的定时被同时触发怎么办? 定时结束的时候,怎么通知业务机去处理呢? 某台业务机下线...

    whataa 评论0 收藏0
  • laravel 任务调度实例

    摘要:导语之前写过使用的进行定时任务,实际上也可以执行定时任务。需求是统计每日访问的数,虽然数据表中有数据,为了演示,新建监听器统计。记录这篇文章中介绍了实现了事件监听器,在此基础上进行扩展。 导语 之前写过使用 Linux 的进行定时任务,实际上 laravel 也可以执行定时任务。需求是统计每日访问的 IP 数,虽然数据表中有数据,为了演示,新建监听器统计。 记录 IP 这篇文章中介绍了...

    loonggg 评论0 收藏0

发表评论

0条评论

endiat

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<