xhStatVisitByDayService.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace common\services;
  3. use Yii;
  4. use common\components\dict;
  5. use common\components\stringUtil;
  6. use linslin\yii2\curl;
  7. use common\components\wxUtil;
  8. use common\models\xhStatVisitByDay;
  9. class xhStatVisitByDayService {
  10. /**
  11. * 统计当天访问量,收集当天访问的IP
  12. */
  13. public static function gatherIP($sjId)
  14. {
  15. $ip = Yii::$app->request->userIP;
  16. $todayTime = strtotime(date("Y-m-d"));
  17. $visitKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$todayTime;
  18. $exists = Yii::$app->redis->executeCommand('SISMEMBER', [$visitKey,$ip]);
  19. if(!empty($exists)){
  20. return;
  21. }
  22. Yii::$app->redis->executeCommand('SADD', [$visitKey,$ip]);//记录当天访问过网站的IP
  23. $numKey = $sjId.dict::getCacheKey('statVisitNumByDay').$todayTime;
  24. $nowNum = Yii::$app->redis->executeCommand('INCRBY', [$numKey,1]);//记录当天访问网站人数
  25. }
  26. /**
  27. * 将昨天的保存入库
  28. */
  29. public static function saveYesterdayNum($sjId)
  30. {
  31. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  32. $arr = xhStatVisitByDay::getByCondition(['sjId' => $sjId,'time' => $yesTime]);
  33. if(!empty($arr)){
  34. return [];
  35. }
  36. $ipListKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  37. $num = Yii::$app->redis->executeCommand('SCARD', [$ipListKey]);
  38. $totalVisit = self::getYesterdayTotalVisit($sjId);
  39. $data = ['time' => $yesTime,'totalNum' => $totalVisit,'riseNum' =>$num,'sjId' => $sjId,'createTime' => date("Y-m-d H:i:s")];
  40. $saveData = self::add($data);
  41. return $saveData;
  42. }
  43. /**
  44. * 总访问量
  45. */
  46. public static function getTotalVisit($sjId)
  47. {
  48. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  49. $ipListKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  50. $yesNum = Yii::$app->redis->executeCommand('SCARD', [$ipListKey]);
  51. $todayTime = strtotime(date("Y-m-d"));
  52. $toDayIPListKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$todayTime;
  53. $todayNum = Yii::$app->redis->executeCommand('SCARD', [$toDayIPListKey]);
  54. $asset = xhMerchantAssetService::getBySjId($sjId);
  55. $totalVisit = $asset['totalVisit'];
  56. $newTotalVisit = $totalVisit + $yesNum + $todayNum;
  57. return $newTotalVisit;
  58. }
  59. /**
  60. * 昨天及以前的总访问量,不包括当天的
  61. */
  62. public static function getYesterdayTotalVisit()
  63. {
  64. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  65. $ipListKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  66. $yesNum = Yii::$app->redis->executeCommand('SCARD', [$ipListKey]);
  67. $asset = xhMerchantAssetService::getBySjId($sjId);
  68. $totalVisit = $asset['totalVisit'];
  69. $newTotalVisit = $totalVisit + $yesNum;
  70. return $newTotalVisit;
  71. }
  72. /**
  73. * 清空昨天的访问数据(包括缓存与数据库)
  74. */
  75. public static function clearYesNum($sjId)
  76. {
  77. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  78. $visitKey = $sjId.dict::getCacheKey('statVisitNumByDay').$yesTime;
  79. $yesterdayVisitNum = Yii::$app->redis->executeCommand('DEL', [$visitKey]);
  80. $ipKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  81. $yesterdayVisitNum = Yii::$app->redis->executeCommand('DEL', [$ipKey]);
  82. xhStatVisitByDay::deleteByCondition(['sjId' => $sjId,'time' => $yesTime]);
  83. }
  84. /**
  85. * 模拟创建昨天的访问IP与数据
  86. */
  87. public static function imitationCreateYesNum($sjId)
  88. {
  89. $count = rand(10,30);
  90. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  91. echo "\n开始创建昨天的访问量…\n";
  92. for($i=0;$i<$count;$i++){
  93. $ip = stringUtil::randIP();
  94. $visitIPKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  95. $exists = Yii::$app->redis->executeCommand('SISMEMBER', [$visitKey,$ip]);
  96. if(!empty($exists)){
  97. return;
  98. }
  99. echo $visitIPKey."\n";
  100. Yii::$app->redis->executeCommand('SADD', [$visitIPKey,$ip]);//记录访问过网站的IP
  101. $numKey = $sjId.dict::getCacheKey('statVisitNumByDay').$yesTime;
  102. $nowNum = Yii::$app->redis->executeCommand('INCRBY', [$numKey,1]);//记录访问网站人数
  103. }
  104. echo "\n创建完成\n";
  105. }
  106. /**
  107. * 获取昨天的访问IP和数据
  108. */
  109. public static function getYesNum($sjId)
  110. {
  111. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  112. $visitPreKey = dict::getCacheKey('statVisitNumByDay');
  113. $visitKey = $sjId.$visitPreKey.$yesTime;
  114. $yesterdayVisitNum = Yii::$app->redis->executeCommand('GET', [$visitKey]);
  115. echo '<pre>';
  116. echo '昨天的访问总量:'.$yesterdayVisitNum.'<br />';
  117. $ipKey = $sjId.dict::getCacheKey('gatherVisitIPByDay').$yesTime;
  118. echo 'ipList的Key:'.$ipKey.'<br />';
  119. $list = Yii::$app->redis->executeCommand('SMEMBERS', [$ipKey]);
  120. echo 'ipList:<br />';
  121. print_r($list);
  122. $num = Yii::$app->redis->executeCommand('SCARD', [$ipKey]);
  123. echo 'ipList里的访问数量统计:'.$num;
  124. }
  125. /**
  126. * 获取今天的访问量
  127. */
  128. public static function getTodayNum($sjId)
  129. {
  130. $time = strtotime(date("Y-m-d"));
  131. $numKey = $sjId.dict::getCacheKey('statVisitNumByDay').$time;
  132. $nowNum = Yii::$app->redis->executeCommand('GET', [$numKey]);//记录当天访问网站人数
  133. $nowNum = !empty($nowNum) ? $nowNum : 0;
  134. return $nowNum;
  135. }
  136. /**
  137. * 取昨天访问量
  138. */
  139. public static function getYesterdayNum($sjId)
  140. {
  141. $yesTime = strtotime(date("Y-m-d",strtotime("-1 day")));
  142. $visitPreKey = dict::getCacheKey('statVisitNumByDay');
  143. $visitKey = $sjId.$visitPreKey.$yesTime;
  144. $status = Yii::$app->redis->executeCommand('EXISTS', [$visitKey]);
  145. if(!empty($status)){
  146. $yesterdayVisitNum = Yii::$app->redis->executeCommand('GET', [$visitKey]);
  147. return $yesterdayVisitNum;
  148. }
  149. $rise = xhStatVisitByDay::getByCondition(['time' => $yesTime]);
  150. $num = !empty($rise) ? $rise['riseNum'] : 0;
  151. Yii::$app->redis->executeCommand('SET', [$visitKey,$num]);
  152. return $num;
  153. }
  154. public static function add($data)
  155. {
  156. return xhStatVisitByDay::add($data);
  157. }
  158. }