Plantask.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use Redis;
  5. use think\Db;
  6. use app\common\library\Easemob;
  7. class Plantask extends Controller
  8. {
  9. //关于本文件里的计划任务
  10. //只有 public 方法,auto_开头的才是计划任务,其他private 方法都是工具方法
  11. ////////////////////////////////////////下面都是计划任务方法///////////////////////////////////////////////////////////////
  12. //自动删除3天前的爆币日志,提升统计速度
  13. public function auto_del_baobi_log(){
  14. $today_start = strtotime(date('Y-m-d')) - (86400 * 1);
  15. $map = [
  16. 'createtime' => ['lt',$today_start],
  17. ];
  18. Db::name('gift_baobi_log')->where($map)->delete();
  19. }
  20. //每天24点,房间流水重置:麦位红心,两个排行榜
  21. public function auto_party_clear(){
  22. $update = ['party_hot'=>0];
  23. Db::name('party')->where('id','neq',0)->update($update);
  24. //redis
  25. $redis = new Redis();
  26. $redisconfig = config("redis");
  27. $redis->connect($redisconfig["host"], $redisconfig["port"]);
  28. if ($redisconfig['redis_pwd']) {
  29. $redis->auth($redisconfig['redis_pwd']);
  30. }
  31. if($redisconfig['redis_selectdb'] > 0){
  32. $redis->select($redisconfig['redis_selectdb']);
  33. }
  34. //所有正常的房间
  35. $partyInfo_arr = Db::name('party')->where('status',1)->column('id,user_id,easemob_room_id');
  36. //dump($partyInfo_arr);exit;
  37. foreach($partyInfo_arr as $party_id => $partyInfo){
  38. //用户魅力榜,清空
  39. $redis->zRemRangeByRank("hourCharm_".$party_id, 0,-1);
  40. //用户贡献榜,清空
  41. $redis->zRemRangeByRank("hourWealth_".$party_id, 0,-1);
  42. //贡献榜前三,设置为空
  43. $redis->hSet("user_jewel_top3",$party_id,json_encode([]));
  44. }
  45. foreach($partyInfo_arr as $party_id => $partyInfo){
  46. //更新麦位魅力值
  47. $this->clearSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
  48. }
  49. }
  50. //送礼物(api/party/giveGiftToYou)拆分出来的异步用户升级方法,
  51. public function auto_while_sleep(){
  52. $i = 6;
  53. while($i > 0){
  54. $i--;
  55. echo '第'.$i.'次';
  56. $starttime = time();
  57. echo date('Y-m-d H:i:s',$starttime);echo '<br/>';
  58. $this->auto_user_level_up_new();
  59. $endtime = time();
  60. echo date('Y-m-d H:i:s',$endtime);echo '<br/>';
  61. $sleeptime = 8 - ($endtime - $starttime);
  62. if($sleeptime < 0){
  63. $sleeptime = 1;
  64. }
  65. ob_flush();
  66. flush();
  67. sleep($sleeptime);
  68. }
  69. }
  70. //最新方法
  71. public function auto_user_level_up_new(){
  72. $tasklist = Db::name('gift_user_party')->where('task_status',0)->order('id asc')->field('party_id')->select();
  73. if(empty($tasklist)){
  74. echo 'empty';
  75. return true;
  76. }
  77. //redis
  78. $redis = new Redis();
  79. $redisconfig = config("redis");
  80. $redis->connect($redisconfig["host"], $redisconfig["port"]);
  81. if ($redisconfig['redis_pwd']) {
  82. $redis->auth($redisconfig['redis_pwd']);
  83. }
  84. if($redisconfig['redis_selectdb'] > 0){
  85. $redis->select($redisconfig['redis_selectdb']);
  86. }
  87. //去重的party_id
  88. $party_ids = array_column($tasklist,'party_id');
  89. $party_ids = array_flip($party_ids);
  90. $party_ids = array_flip($party_ids);
  91. //dump($party_ids);
  92. //更新任务状态
  93. $rs_up = Db::name('gift_user_party')->where('task_status',0)->where('party_id','IN',$party_ids)->update(['task_status'=>1]);
  94. $partyInfo_arr = Db::name('party')->where('id','IN',$party_ids)->column('id,user_id,easemob_room_id');
  95. //dump($partyInfo_arr);exit;
  96. foreach($partyInfo_arr as $party_id => $partyInfo){
  97. //更新麦位魅力值
  98. $this->updateSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
  99. }
  100. }
  101. public function auto_user_level_up(){
  102. Db::startTrans();
  103. $tasklist = Db::name('gift_user_party')->where('task_status',0)->order('id asc')->field('party_id')->select();
  104. if(empty($tasklist)){
  105. Db::rollback();
  106. echo 'empty';
  107. exit;
  108. }
  109. try {
  110. //redis
  111. $redis = new Redis();
  112. $redisconfig = config("redis");
  113. $redis->connect($redisconfig["host"], $redisconfig["port"]);
  114. if ($redisconfig['redis_pwd']) {
  115. $redis->auth($redisconfig['redis_pwd']);
  116. }
  117. if($redisconfig['redis_selectdb'] > 0){
  118. $redis->select($redisconfig['redis_selectdb']);
  119. }
  120. //开始
  121. $party_ids = array_column($tasklist,'party_id');
  122. $party_ids = array_flip($party_ids);
  123. $party_ids = array_flip($party_ids);
  124. //dump($party_ids);
  125. $partyInfo_arr = Db::name('party')->where('id','IN',$party_ids)->column('id,user_id,easemob_room_id');
  126. //dump($partyInfo_arr);exit;
  127. foreach($partyInfo_arr as $party_id => $partyInfo){
  128. //更新麦位魅力值
  129. $this->updateSeatCharm($partyInfo['easemob_room_id'],$partyInfo,$redis);
  130. }
  131. //结束
  132. $rs_up = Db::name('gift_user_party')->where('party_id','IN',$party_ids)->update(['task_status'=>1]);
  133. Db::commit();
  134. } catch (ValidateException $e) {
  135. Db::rollback();
  136. $this->error($e->getMessage());
  137. } catch (PDOException $e) {
  138. Db::rollback();
  139. $this->error($e->getMessage());
  140. } catch (Exception $e) {
  141. Db::rollback();
  142. $this->error($e->getMessage());
  143. }
  144. }
  145. /////////////////////////////////////////下面都是工具方法////////////////////////////////////////////////
  146. /**
  147. * 用户赠送礼物后房间内麦位魅力值增加,更新到麦位自定义信息
  148. * $seatnum 座位数字 1,不是键名 seat1
  149. */
  150. private function updateSeatCharm($easemob_room_id,$party_info,$redis) {
  151. //获取已有信息
  152. try {
  153. $easemob = new Easemob();
  154. $seatlist = $easemob->room_getRoomCustomAttribute($easemob_room_id,['seat0','seat1','seat2','seat3','seat4','seat5','seat6','seat7']);
  155. if(empty($seatlist)){
  156. return true;
  157. }
  158. $matedata = [];
  159. // 获取用户魅力值
  160. $users = $redis->zRevRange("hourCharm_".$party_info['id'],0,-1,true);
  161. //轮询麦位
  162. foreach($seatlist as $seatnum => $seatdata){
  163. $seatdata = json_decode($seatdata,true);
  164. if($users) {
  165. foreach($users as $user_id => $charm){
  166. if(isset($seatdata['userNo']) && $seatdata['userNo'] == $user_id){
  167. $seatdata['charm'] = changeW($charm);
  168. }
  169. }
  170. }
  171. $seatdata = json_encode($seatdata);
  172. $matedata[$seatnum] = $seatdata;
  173. }
  174. //重新设置麦位小红心
  175. //获取房间用户周前三名 getPartyUserTop里面摘出来的一部分
  176. //[环信]更新财富榜前3。
  177. $avatarArr = $redis->hGet("user_jewel_top3",$party_info['id']);
  178. $matedata['wealth_top3_userlist'] = $avatarArr;
  179. $easemob->room_setRoomCustomAttributeForced($easemob_room_id,$party_info['user_id'],$matedata);
  180. return true;
  181. } catch (ValidateException $e) {
  182. return $e->getMessage();
  183. } catch (PDOException $e) {
  184. return $e->getMessage();
  185. } catch (Exception $e) {
  186. return $e->getMessage();
  187. }
  188. return true;
  189. }
  190. /**
  191. * 更新到麦位小红心为0,房间内榜前三清空
  192. */
  193. private function clearSeatCharm($easemob_room_id,$party_info,$redis) {
  194. //获取已有信息
  195. $easemob = new Easemob();
  196. $seatlist = $easemob->room_getRoomCustomAttribute($easemob_room_id,['seat0','seat1','seat2','seat3','seat4','seat5','seat6','seat7']);
  197. if(empty($seatlist)){
  198. return true;
  199. }
  200. $matedata = [];
  201. //轮询麦位
  202. foreach($seatlist as $seatnum => $seatdata){
  203. $seatdata = json_decode($seatdata,true);
  204. $seatdata['charm'] = 0;//改为0
  205. $seatdata = json_encode($seatdata);
  206. $matedata[$seatnum] = $seatdata;
  207. }
  208. //重新设置麦位小红心
  209. //获取房间用户周前三名 getPartyUserTop里面摘出来的一部分
  210. //[环信]更新财富榜前3。
  211. $avatarArr = $redis->hGet("user_jewel_top3",$party_info['id']);
  212. $matedata['wealth_top3_userlist'] = $avatarArr;
  213. $easemob->room_setRoomCustomAttributeForced($easemob_room_id,$party_info['user_id'],$matedata);
  214. return true;
  215. }
  216. }