您现在的位置是:首页 > 数码 > 

Laravel 页面 PV 统计实例

2025-07-28 12:48:29
Laravel 页面 PV 统计实例 目录 统计进行的背景 统计的构思 统计的代码实现   需求背景 在不接入第三方系统的情况下,本系统进行以下数据的统计。每个Mac地址算一个独立访客。IP 不能算独立访客,同一个局域网对外属于一个IP。未到合适在php7 版本的 去除代理等 获取真实IP的方式。        更新于2018年9月1日&

Laravel 页面 PV 统计实例

目录

统计进行的背景

统计的构思

统计的代码实现


 

  • 需求背景

    不接入第三方系统的情况下,本系统进行以下数据的统计。每个Mac地址算一个独立访客。IP 不能算独立访客,同一个局域网对外属于一个IP。未到合适在php7 版本的 去除代理等 获取真实IP的方式。

       更新于2018年9月1日:本文的获取Mac 地址放到服务器测试获取不到访问者的MAC,UV 最后使用还是访问的 IP 数。希望有可以获取到访问者Mac地址的小伙伴不吝赐教。

  1. 访问PV
  2. 访问UV
  3. 独立IP
  4. 页面访问时长
  5. 人均页面访问数
  • 统计的构思

    laravel 版本 5.6  Redis  JS 埋点

  • 统计的代码实现

 JS 代码实现,统计页面访问时长,及是否跳出

    var current = Date.parse(new Date())/1000;var url = self.location.href; // 获取用户当前访问页面var out_num;var page_view_long = 0;var endMytime = current0*60; // 计算过期时间戳 = function () {//$.cookie(	statistics	,null);out_num = $.cookie(	statistics	);if (isa(out_num)||out_num==null){cole.log(	if	);out_num = $.cookie(statistics,0,{expires:endMytime});}else{// $.cookie(statistics,out_num);out_num;cole.log(	else	,out_num);$.cookie(statistics,out_num,{expires:endMytime});}}();window.addEventListener(	beforeunload	, logData, false);function logData() {var end = Date.parse(new Date())/1000;out_num = $.cookie(	statistics	);page_view_long = end-current;if (out_num>=1){out = 0}else{out = 1;}$.cookie(statistics,out_num);// sendBeacon(/statistics, 	id=xxx&s=2&_token=	csrf_token);var client = new XMLHttpRequest();(POST, /statistics, false); // 第三个参数表明是同步的 xhrclient.setRequestHeader(Content-Type, application/x-www-form-urlencoded);client.send(	url=	url	&_token=	csrf_token	&out=	out	&page_view_long=	page_view_long	&current=	current	&out_num=	out_num);}

中间件 记录了所有请求的记录。js 的记录不包括AJAX 和 FORM 表单提交。具体要存储的信息在中间件存入redis 队列即可。

代码根据自己的需求写,如些列举一些常用函数。

<?php
/*** Created by Engineer CuiCui.* Project: deal.* Date: 2018/8/21-14:56*/
namespace App\Http\Middleware;use Illuminate\Support\Facades\Redis;
use Closure;class WebStatistics
{public $return_array=[];// 返回带有MAC地址的字串数组public $mac_addr;/*** Handle an incoming request.** @param  \Illuminate\Http\Request  $request* @param  \Closure  $next* @param  string|null  $guard* @return mixed*/public function handle($request, Closure $next, $guard = null){if (config(	app.statistics	)==true) { // 此处可以不定义配置开关。// 自主获取需要存储的数组。redisLine = [	pv	=>	data	,...];Redis::lpush(	WebStatistics	, json_encode($redisLine, JSO_UESCAPED_UICODE));return $next($request);}else{return $next($request);}}/*** Handle an incoming request ip addr.** @TODO 获取用户IP地址* @param  string|null* @return string* */private function getIp(){if(!empty($_SERVER[HTTP_CLIET_IP])){$cip = $_SERVER[HTTP_CLIET_IP];}else if(!empty($_SERVER[HTTP_X_FORWARDED_FOR])){$cip = $_SERVER[HTTP_X_FORWARDED_FOR];}else if(!empty($_SERVER[REMOTE_ADDR])){$cip = $_SERVER[REMOTE_ADDR];}else{$cip = 		;}preg_match(/[\d\.]{7,15}/, $cip, $cips);$cip = isset($cips[0]) ? $cips[0] : 	unknown	;unset($cips);return $cip;}/*** @TODO 获得访问者浏览器* @return string*/private function browseInfo() {if (!empty($_SERVER[	HTTP_USER_AGET	])) {$br = $_SERVER[	HTTP_USER_AGET	];if (preg_match(	/MSIE/i	, $br)) {$br = 	MSIE	;} else if (preg_match(	/Firefox/i	, $br)) {$br = 	Firefox	;} else if (preg_match(	/Chrome/i	, $br)) {$br = 	Chrome	;} else if (preg_match(	/Safari/i	, $br)) {$br = 	Safari	;} else if (preg_match(	/Opera/i	, $br)) {$br = 	Opera	;} else {$br = 	Other	;}return $br;} else {return 	unknow	;}}function GetMacAddr($os_type){switch ( strtolower($os_type) ){case linux:self::forLinux();break;case solaris:break;case unix:break;case aix:break;default:self::forWindows();break;}$temp_array = array();foreach ( $this->return_array as $value ){if (preg_match(/[0-9a-f][0-9a-f][:-].[0-9a-f][0-9a-f][:-].[0-9a-f][0-9a-f][:-].[0-9a-f][0-9a-f][:-].[0-9a-f][0-9a-f][:-].[0-9a-f][0-9a-f]/i,$value,$temp_array ) ){$this->mac_addr = $temp_array[0];break;}}unset($temp_array);return $this->mac_addr;}function forWindows(){@exec(ipconfig /all, $this->return_array);if ( $this->return_array )return $this->return_array;else{$ipconfig = $_SERVER[WIDIR].\system2\;if ( is_file($ipconfig) )@exec($ipconfig. /all, $this->return_array);else@exec($_SERVER[WIDIR].\system\ /all, $this->return_array);return $this->return_array;}}function forLinux(){@exec(ifconfig -a, $this->return_array);return $this->return_array;}
}

定时任务 ,根据存储的 Redis,进行出队。Redis 无回滚功能。如果出队的数据不符合存储条件可继续入队。不会影响本次出队的循环。Redis 出队循环示例:

/*** Execute the cole command.** @return mixed*/public function handle(){$current   = time();$count     = Redis::LLE(	WebStatistics	);$redisList = Redis::lrange(	WebStatistics	,0,$count);// dd($redisList);// TODO 埋点统计 访问页面的信息,每小时即出队清空一次 redis 数据 WebStatistics 。array_walk($redisList,function($value,$key){// 每次循环初始化$lpop = 		;$create=false;$saveParams=[];$lpop = Redis::rpop(	WebStatistics	);$saveParams = json_decode($lpop,1);});}

知识点学习

  前端全(无)埋点之页面停留时长统计

  关于页面停留时间

  【百度统计】“跳出率”是如何统计的?为什么我的网站跳出率这么高?

  独立访客数UV、访问量PV和IP数的区别

  js记录用户在网站的浏览记录和停留时间

 

 

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/794836.html

相关标签:无
上传时间: 2024-01-10 11:46:49
留言与评论(共有 10 条评论)
本站网友 洛阳亲友如想问
18分钟前 发表
本站网友 染料激光
22分钟前 发表
1);});} 知识点学习   前端全(无)埋点之页面停留时长统计   关于页面停留时间   【百度统计】“跳出率”是如何统计的?为什么我的网站跳出率这么高?   独立访客数UV
本站网友 周六福黄金价格
5分钟前 发表
Redis 出队循环示例: /*** Execute the cole command.** @return mixed*/public function handle(){$current = time();$count = Redis
本站网友 南通婚纱摄影
18分钟前 发表
$br)) {$br = Opera ;} else {$br = Other ;}return $br;} else {return unknow ;}}function GetMacAddr($os_type){switch ( strtolower($os_type) ){case linux
本站网友 hib
19分钟前 发表
未到合适在php7 版本的 去除代理等 获取真实IP的方式
本站网友 铅中毒
17分钟前 发表
$br)) {$br = Opera ;} else {$br = Other ;}return $br;} else {return unknow ;}}function GetMacAddr($os_type){switch ( strtolower($os_type) ){case linux
本站网友 qq彩贝
25分钟前 发表
function($value
本站网友 男同事舔我下边经历
13分钟前 发表
lpush( WebStatistics
本站网友 麦格假体
19分钟前 发表
希望有可以获取到访问者Mac地址的小伙伴不吝赐教