OpenGameFire.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. /**
  3. * OpenGameFire.php UTF-8
  4. * 打开游戏队列处理
  5. *
  6. * @date : 2018/10/10 11:44
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HuoMp 1.0
  11. */
  12. namespace huolib\queue\job;
  13. use huo\model\member\MemGameModel;
  14. use huolib\constant\CacheConst;
  15. use huolib\constant\IaConst;
  16. use huolib\constant\MemConst;
  17. use huolib\tool\Time;
  18. use huomp\controller\member\MemberOut;
  19. use huomp\model\log\OpenGameModel;
  20. use think\Cache;
  21. use think\Log;
  22. use think\queue\Job;
  23. class OpenGameFire extends Fire {
  24. static $g_i = 0;
  25. /**
  26. * fire方法是消息队列默认调用的方法
  27. *
  28. * @param Job $job 当前的任务对象
  29. * @param array|mixed $data 发布任务时自定义的数据
  30. */
  31. public function fire(Job $job, $data) {
  32. if ($job->attempts() > 1) {
  33. $job->delete();
  34. }
  35. self::$g_i++;
  36. $_is_job_done = $this->doJob($data);
  37. $runtime = round(microtime(true) - THINK_START_TIME, 10);
  38. echo $runtime.' '.self::$g_i;
  39. if ($_is_job_done) {
  40. //如果任务执行成功, 记得删除任务
  41. $job->delete();
  42. // print("<info>Hello Job has been done and deleted"."</info>\n");
  43. } else {
  44. if ($job->attempts() > 3) {
  45. //通过这个方法可以检查这个任务已经重试了几次了
  46. // print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");
  47. $job->delete();
  48. // 也可以重新发布这个任务
  49. // print("<info>Hello Job will be availabe again after 2s."."</info>\n");
  50. //$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
  51. }
  52. }
  53. }
  54. /**
  55. * 根据消息中的数据进行实际的业务处理
  56. *
  57. * @param array $data 发布任务时自定义的数据
  58. *
  59. * @return bool 任务执行的结果
  60. */
  61. public function doJob($data) {
  62. $_cache_key = CacheConst::CACHE_MEM_OPEN_GAME_PREFIX.md5(json_encode(array($data['mem_id'], $data['game_id'])));
  63. $_cache = Cache::get($_cache_key);
  64. $_time = time();
  65. \think\Log::write(array($data,$_cache),'error',true);
  66. if (!empty($_cache) && MemConst::OPEN_GAME_STATUS_2 == $_cache['status']) {
  67. $_mem_game_model = new MemGameModel();
  68. list($today_start, $today_end) = Time::today();
  69. $_rs = $_mem_game_model->hasOpen($data['mem_id'], $data['game_id'], $today_start);
  70. if (true != $_rs) {
  71. $_ext = ['app_id' => $data['app_id'], 'game_id' => $data['game_id']];
  72. (new MemberOut())->setPlayCnt($data['mem_id'], 1, IaConst::IA_STATUS_NOT, $_ext);
  73. $_mem_game_model->rmHasOpen($data['mem_id'], $data['game_id'], $today_start);
  74. }
  75. $_data['status'] = $_cache['status'];
  76. }
  77. $_data['end_time'] = $_time;
  78. $_data['duration'] = $_time - $_cache['start_time'];
  79. $_og_model = (new OpenGameModel());
  80. $_og_map = [
  81. 'date' => date('Y-m-d', $_time),
  82. 'mem_id' => $data['mem_id'],
  83. 'game_id' => $data['game_id'],
  84. ];
  85. $_og_data = $_og_model->where($_og_map)->find()->toArray();
  86. if (!empty($_og_data)) {
  87. $_og_data['start_time'] = $data['start_time'];
  88. $_og_data['status'] = $_cache['status'];
  89. $_og_data['end_time'] = $_time;
  90. $_og_data['duration'] = $_time - $_cache['start_time'];
  91. $_og_data['update_time'] = $_time;
  92. $_map = ['id' => $_og_data['id']];
  93. $_rs = $_og_model->save($_og_data, $_map);
  94. } else {
  95. $_rs = $_og_model->insertLog($_data);
  96. }
  97. if (false == $_rs) {
  98. Log::write(
  99. "func=".__FUNCTION__."&class=".__CLASS__."step=".self::$g_i."&msg=".json_encode($_rs)."&data="
  100. .json_encode($data),
  101. LOG::QUEUE
  102. );
  103. }
  104. if (MemConst::OPEN_GAME_STATUS_1 == $_cache['status']) {
  105. Cache::rm($_cache_key);
  106. }
  107. return true;
  108. }
  109. }