123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- <?php
- namespace app\index\controller;
- use think\Controller;
- use Redis;
- use think\Db;
- use app\common\library\Easemob;
- class Plantask extends Controller
- {
- //关于本文件里的计划任务
- //只有 public 方法,auto_开头的才是计划任务,其他private 方法都是工具方法
- ////////////////////////////////////////下面都是计划任务方法///////////////////////////////////////////////////////////////
- //自动删除3天前的爆币日志,提升统计速度
- public function auto_del_baobi_log(){
- $today_start = strtotime(date('Y-m-d')) - (86400 * 1);
- $map = [
- 'createtime' => ['lt',$today_start],
- ];
- Db::name('gift_baobi_log')->where($map)->delete();
- }
- //每天24点,房间流水重置:麦位红心,两个排行榜
- public function auto_party_clear(){
- $update = ['party_hot'=>0];
- Db::name('party')->where('id','neq',0)->update($update);
- //redis
- $redis = new Redis();
- $redisconfig = config("redis");
- $redis->connect($redisconfig["host"], $redisconfig["port"]);
- if ($redisconfig['redis_pwd']) {
- $redis->auth($redisconfig['redis_pwd']);
- }
- if($redisconfig['redis_selectdb'] > 0){
- $redis->select($redisconfig['redis_selectdb']);
- }
- //所有正常的房间
- $partyInfo_arr = Db::name('party')->where('status',1)->column('id,user_id,easemob_room_id');
- //dump($partyInfo_arr);exit;
- foreach($partyInfo_arr as $party_id => $partyInfo){
- //用户魅力榜,清空
- $redis->zRemRangeByRank("hourCharm_".$party_id, 0,-1);
- //用户贡献榜,清空
- $redis->zRemRangeByRank("hourWealth_".$party_id, 0,-1);
- //贡献榜前三,设置为空
- $redis->hSet("user_jewel_top3",$party_id,json_encode([]));
- }
- foreach($partyInfo_arr as $party_id => $partyInfo){
- //更新麦位魅力值
- $this->clearSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
- }
- }
- //送礼物(api/party/giveGiftToYou)拆分出来的异步用户升级方法,
- public function auto_while_sleep(){
- $i = 6;
- while($i > 0){
- $i--;
- echo '第'.$i.'次';
- $starttime = time();
- echo date('Y-m-d H:i:s',$starttime);echo '<br/>';
- $this->auto_user_level_up_new();
- $endtime = time();
- echo date('Y-m-d H:i:s',$endtime);echo '<br/>';
- $sleeptime = 8 - ($endtime - $starttime);
- if($sleeptime < 0){
- $sleeptime = 1;
- }
- ob_flush();
- flush();
- sleep($sleeptime);
- }
- }
- //最新方法
- public function auto_user_level_up_new(){
- $tasklist = Db::name('gift_user_party')->where('task_status',0)->order('id asc')->field('party_id')->select();
- if(empty($tasklist)){
- echo 'empty';
- return true;
- }
- //redis
- $redis = new Redis();
- $redisconfig = config("redis");
- $redis->connect($redisconfig["host"], $redisconfig["port"]);
- if ($redisconfig['redis_pwd']) {
- $redis->auth($redisconfig['redis_pwd']);
- }
- if($redisconfig['redis_selectdb'] > 0){
- $redis->select($redisconfig['redis_selectdb']);
- }
- //去重的party_id
- $party_ids = array_column($tasklist,'party_id');
- $party_ids = array_flip($party_ids);
- $party_ids = array_flip($party_ids);
- //dump($party_ids);
- //更新任务状态
- $rs_up = Db::name('gift_user_party')->where('task_status',0)->where('party_id','IN',$party_ids)->update(['task_status'=>1]);
- $partyInfo_arr = Db::name('party')->where('id','IN',$party_ids)->column('id,user_id,easemob_room_id');
- //dump($partyInfo_arr);exit;
- foreach($partyInfo_arr as $party_id => $partyInfo){
- //更新麦位魅力值
- $this->updateSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
- }
- }
- public function auto_user_level_up(){
- Db::startTrans();
- $tasklist = Db::name('gift_user_party')->where('task_status',0)->order('id asc')->field('party_id')->select();
- if(empty($tasklist)){
- Db::rollback();
- echo 'empty';
- exit;
- }
- try {
- //redis
- $redis = new Redis();
- $redisconfig = config("redis");
- $redis->connect($redisconfig["host"], $redisconfig["port"]);
- if ($redisconfig['redis_pwd']) {
- $redis->auth($redisconfig['redis_pwd']);
- }
- if($redisconfig['redis_selectdb'] > 0){
- $redis->select($redisconfig['redis_selectdb']);
- }
- //开始
- $party_ids = array_column($tasklist,'party_id');
- $party_ids = array_flip($party_ids);
- $party_ids = array_flip($party_ids);
- //dump($party_ids);
- $partyInfo_arr = Db::name('party')->where('id','IN',$party_ids)->column('id,user_id,easemob_room_id');
- //dump($partyInfo_arr);exit;
- foreach($partyInfo_arr as $party_id => $partyInfo){
- //更新麦位魅力值
- $this->updateSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
- }
- //结束
- $rs_up = Db::name('gift_user_party')->where('party_id','IN',$party_ids)->update(['task_status'=>1]);
- Db::commit();
- } catch (ValidateException $e) {
- Db::rollback();
- $this->error($e->getMessage());
- } catch (PDOException $e) {
- Db::rollback();
- $this->error($e->getMessage());
- } catch (Exception $e) {
- Db::rollback();
- $this->error($e->getMessage());
- }
- }
- /////////////////////////////////////////下面都是工具方法////////////////////////////////////////////////
- /**
- * 用户赠送礼物后房间内麦位魅力值增加,更新到麦位自定义信息
- * $seatnum 座位数字 1,不是键名 seat1
- */
- private function updateSeatCharm($easemob_room_id,$party_info,$redis) {
- //获取已有信息
- try {
- $easemob = new Easemob();
- $seatlist = $easemob->room_getRoomCustomAttribute($easemob_room_id,['seat0','seat1','seat2','seat3','seat4','seat5','seat6','seat7']);
- if(empty($seatlist)){
- return true;
- }
- $matedata = [];
- // 获取用户魅力值
- $users = $redis->zRevRange("hourCharm_".$party_info['id'],0,-1,true);
- //轮询麦位
- foreach($seatlist as $seatnum => $seatdata){
- $seatdata = json_decode($seatdata,true);
- if($users) {
- foreach($users as $user_id => $charm){
- if(isset($seatdata['userNo']) && $seatdata['userNo'] == $user_id){
- $seatdata['charm'] = changeW($charm);
- }
- }
- }
- $seatdata = json_encode($seatdata);
- $matedata[$seatnum] = $seatdata;
- }
- //重新设置麦位小红心
- //获取房间用户周前三名 getPartyUserTop里面摘出来的一部分
- //[环信]更新财富榜前3。
- $avatarArr = $redis->hGet("user_jewel_top3",$party_info['id']);
- $matedata['wealth_top3_userlist'] = $avatarArr;
- $easemob->room_setRoomCustomAttributeForced($easemob_room_id,$party_info['user_id'],$matedata);
- return true;
- } catch (ValidateException $e) {
- return $e->getMessage();
- } catch (PDOException $e) {
- return $e->getMessage();
- } catch (Exception $e) {
- return $e->getMessage();
- }
- return true;
- }
- /**
- * 更新到麦位小红心为0,房间内榜前三清空
- */
- private function clearSeatCharm($easemob_room_id,$party_info,$redis) {
- //获取已有信息
- $easemob = new Easemob();
- $seatlist = $easemob->room_getRoomCustomAttribute($easemob_room_id,['seat0','seat1','seat2','seat3','seat4','seat5','seat6','seat7']);
- if(empty($seatlist)){
- return true;
- }
- $matedata = [];
- //轮询麦位
- foreach($seatlist as $seatnum => $seatdata){
- $seatdata = json_decode($seatdata,true);
- $seatdata['charm'] = 0;//改为0
- $seatdata = json_encode($seatdata);
- $matedata[$seatnum] = $seatdata;
- }
- //重新设置麦位小红心
- //获取房间用户周前三名 getPartyUserTop里面摘出来的一部分
- //[环信]更新财富榜前3。
- $avatarArr = $redis->hGet("user_jewel_top3",$party_info['id']);
- $matedata['wealth_top3_userlist'] = $avatarArr;
- $easemob->room_setRoomCustomAttributeForced($easemob_room_id,$party_info['user_id'],$matedata);
- return true;
- }
- }
|