StatVisitService.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace bizMall\stat\services;
  3. use bizMall\base\services\BaseService;
  4. use bizMall\merchant\services\MerchantAssetService;
  5. use bizMall\stat\classes\StatViewClass;
  6. use bizMall\stat\classes\StatVisitClass;
  7. use Yii;
  8. use common\components\stringUtil;
  9. class StatVisitService extends BaseService
  10. {
  11. public static $baseFile = '\bizMall\stat\classes\StatVisitClass';
  12. /**
  13. * 收集访问次数和访问IP
  14. */
  15. public static function gatherVisit($sjId)
  16. {
  17. //收集访问次数
  18. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view');
  19. Yii::$app->redis->executeCommand('INCRBY', [$wholeSiteView, 1]);//记录当天访问人数
  20. //收集访问客数
  21. $ip = Yii::$app->request->userIP;
  22. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit');
  23. $exists = Yii::$app->redis->executeCommand('SISMEMBER', [$wholeSiteVisit, $ip]);
  24. if (empty($exists)) {
  25. //记录当天的IP
  26. Yii::$app->redis->executeCommand('SADD', [$wholeSiteVisit, $ip]);
  27. }
  28. }
  29. /**
  30. * 将昨天的保存入库
  31. */
  32. public static function saveYesterdayNum($sjId)
  33. {
  34. $yesTime = date("Ymd", strtotime("-1 day"));
  35. $resource = self::getByCondition(['sjId' => $sjId, 'time' => $yesTime]);
  36. //有数据表示已经保存过了
  37. if (!empty($resource)) {
  38. return [];
  39. }
  40. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view', $yesTime);
  41. //获取访问次数
  42. $viewNum = Yii::$app->redis->executeCommand('GET', [$wholeSiteView]);
  43. //获取访问客户数
  44. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit', $yesTime);
  45. $visitNum = Yii::$app->redis->executeCommand('SCARD', [$wholeSiteVisit]);
  46. $asset = MerchantAssetService::getBySjId($sjId);
  47. $totalVisit = $asset['totalVisit'];
  48. $totalView = $asset['totalView'];
  49. $totalVisit = stringUtil::calcAdd($totalVisit, $visitNum);
  50. $totalView = stringUtil::calcAdd($totalView, $viewNum);
  51. //保存访客数
  52. $data = ['time' => $yesTime, 'totalNum' => $totalVisit, 'riseNum' => $visitNum, 'sjId' => $sjId, 'createTime' => date("Y-m-d H:i:s")];
  53. self::add($data);
  54. //保存访问量
  55. $data = ['time' => $yesTime, 'totalNum' => $totalView, 'riseNum' => $viewNum, 'sjId' => $sjId, 'addTime' => time()];
  56. StatViewClass::add($data);
  57. //保存累计访问量
  58. MerchantAssetService::updateByCondition(['sjId' => $sjId], ['totalView' => $totalView, 'totalVisit' => $totalVisit]);
  59. self::clearYesNum($sjId);
  60. }
  61. /**
  62. * 清空昨天的缓存
  63. */
  64. public static function clearYesNum($sjId)
  65. {
  66. $yesTime = date("Ymd", strtotime("-1 day"));
  67. //访问量清零
  68. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view', $yesTime);
  69. Yii::$app->redis->executeCommand('DEL', [$wholeSiteView]);
  70. //访客数清零
  71. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit', $yesTime);
  72. Yii::$app->redis->executeCommand('DEL', [$wholeSiteVisit]);
  73. }
  74. //获取今天的访问量
  75. public static function getTodayViewNum($sjId)
  76. {
  77. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view');
  78. $nowNum = Yii::$app->redis->executeCommand('GET', [$wholeSiteView]);
  79. $nowNum = !empty($nowNum) ? $nowNum : 0;
  80. return $nowNum;
  81. }
  82. //获取今天的访客数 ssh 2020.2.2
  83. public static function getTodayVisitNum($sjId)
  84. {
  85. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit');
  86. $num = Yii::$app->redis->executeCommand('SCARD', [$wholeSiteVisit]);
  87. return !empty($num) ? $num : 0;
  88. }
  89. /**
  90. * 获取总访客数
  91. */
  92. public static function getTotalVisit($sjId)
  93. {
  94. $todayNum = self::getTodayVisitNum($sjId);
  95. $asset = MerchantAssetService::getBySjId($sjId);
  96. $totalVisit = $asset['totalVisit'];
  97. $newTotalVisit = stringUtil::calcAdd($totalVisit, $todayNum);
  98. return $newTotalVisit;
  99. }
  100. /**
  101. * 模拟创建昨天的访问IP与数据
  102. */
  103. public static function randYesNum($sjId)
  104. {
  105. $count = rand(10, 30);
  106. $yesTime = date("Ymd", strtotime("-1 day"));
  107. echo "\n开始创建昨天的访问量…\n";
  108. for ($i = 0; $i < $count; $i++) {
  109. $ip = stringUtil::randIP();
  110. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit', $yesTime);
  111. $exists = Yii::$app->redis->executeCommand('SISMEMBER', [$wholeSiteVisit, $ip]);
  112. if (!empty($exists)) {
  113. return;
  114. }
  115. echo $wholeSiteVisit . "\n";
  116. Yii::$app->redis->executeCommand('SADD', [$wholeSiteVisit, $ip]);//记录访问过网站的IP
  117. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view', $yesTime);
  118. Yii::$app->redis->executeCommand('INCRBY', [$wholeSiteView, 1]);//记录访问网站人数
  119. }
  120. echo "\n创建完成\n";
  121. self::getYesNum($sjId);
  122. }
  123. /**
  124. * 获取昨天的访问IP和数据
  125. */
  126. public static function getYesNum($sjId)
  127. {
  128. $yesTime = date("Ymd", strtotime("-1 day"));
  129. $wholeSiteView = StatVisitClass::getKeyName($sjId, 'whole_site_view', $yesTime);
  130. $yesterdayVisitNum = Yii::$app->redis->executeCommand('GET', [$wholeSiteView]);
  131. echo '<pre>';
  132. echo '昨天的访问总量:' . $yesterdayVisitNum . '<br />';
  133. $wholeSiteVisit = StatVisitClass::getKeyName($sjId, 'whole_site_visit', $yesTime);
  134. echo 'ipList的Key:' . $wholeSiteVisit . '<br />';
  135. $list = Yii::$app->redis->executeCommand('SMEMBERS', [$wholeSiteVisit]);
  136. echo 'ipList:<br />';
  137. print_r($list);
  138. $num = Yii::$app->redis->executeCommand('SCARD', [$wholeSiteVisit]);
  139. echo 'ipList里的访问数量统计:' . $num;
  140. }
  141. }