wnzz网站流量统计插件

默认分类 · 2019-05-29 · 1042 人浏览
wnzz网站流量统计插件

、闲来无事写个简易网站流量统计插件:

开发涉及到: php mysql `js `html

  • 效果看下图的第三行 => webpro统计|今日IP[1]|今日PV[9]|昨日IP[0]|昨日PV[0]|当前在线[4]
  • 简易的流量统计插件,数据大致参考即可,没有高级算法,仅统计下IP和PV
  • 不防刷,用软件数据分分钟刷上去
  • 插件非常轻,对网站加载速度影响大概在30ms左右

 title=

一、统计数据分析

  1. 今日IP
  2. 今日PV
  3. 昨日IP
  4. 昨日PV
  5. 当前在线

二、计算方法

1、如何准确获取到客户端IP

统计IP需要获取到客户端真实的IP地址,仅js实现效果并不好。在这里我采用了[搜狐]的接口:

<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>

将该标签嵌入到网页,访问结果如下:

var returnCitySN = {"cip": "223.241.141.73", "cid": "340000", "cname": "安徽省"};

返回了一个 returnCitySN 对象,我们可以获得准确的IP地址、cid(cid是什么给我留言)、地区

通过如下js我们获取到ip、cname

var ip = returnCitySN.cip;
var cname = returnCitySN.cname;

至此,IP已经拿到。

2、后端记录方法

前端将IP、cname、访问的url传输到服务端,服务器端生成time(时间戳),将以下数据存储

表wnzz_visit:

id自动编号int11
ipip地址varchar128
cname地区varchar255
url访问地址varchar255
time访问时间戳int11
siteid统计站点编号int11

我们在最后又添加了一个字段 siteid,用来标记和区分不同的站点,这样可以实现多站点统计,只需要确保siteid不重复即可

表wnzz_cal:

该表的作用是,当某一天已经过去时,自动计算某一天IP和PV总值,记录在这个表中

为什么需要这个表?因为当日统计的IP和PV都是动态计算的,php从数据库读出所有访问的数据,然后再对数据进行统计,如此方法加大了服务器的开销,所以对于一些不必要的重复计算,我们计算一次,存储其即可,下次需要直接读取。

id自动编号int11
timestamp某一天0点的时间戳int11
timestr某一天用字符表示,例如2019-05-05varchar255
ipsIP总数int11
pvsPV总数int11
siteid统计站点编号int11

3、如何计算IP、PV

首先需要确认 siteid 和统计事件的区间:

//设置北京时间为默认时区
date_default_timezone_set('PRC');
// 现在的时间戳
$now = time();
// 现在对应今日0点的时间戳
$today = strtotime(date("Y-m-d"), $now);
// 现在对应昨日0点的时间戳
$yesterday = $today - 86400;
// 现在对应明日0点的时间戳
$tomorrow = $today + 86400;

我们动态统计一下今天的数据,即 today<=time<tomorrow,执行如下sql语句

-- 原生SQL写法
SELECT * FROM `wnzz_visit` WHERE `time`>{$today} AND `time`<{$tomorrow} AND `siteid`={$siteid};
// PHP轻量持久层写法(https://dev.webpro.ltd/blog/?id=34 这个类)
$res_t = $bean->findByX(['ip'], "wnzz_visit", ["time>{$today}", "time<{$tomorrow}", "siteid={$siteid}"]);

从数据库读出的数据形如如下:

datas=>[
  ["ip"=>"127.0.0.1"],
  ["ip"=>"127.0.0.1"],
  ["ip"=>"127.0.0.1"],
  ["ip"=>"127.0.0.2"],
  ["ip"=>"127.0.0.2"],
  ["ip"=>"127.0.0.2"],
  ["ip"=>"127.0.0.3"]
]

用PHP代码表示一下

/**
 * @return array(ips, pvs)
 */
function cal_ipandpv($datas){
    // echo "emmm<br/>";
    // print_r($datas);
    // $ip['192.168.1.1'] = 10;
    $ip = array();
    foreach($datas as $index => $item){
        if(array_key_exists($item['ip'], $ip)){
            // 统计过
            $ip[$item['ip']] += 1;
        }else{
            // 没统计过
            $ip[$item['ip']] = 1;
        }
    }
    // 累加IP和PV
    $ips = 0;
    $pvs = 0;
    foreach($ip as $keyip => $count){
        $ips++;
        $pvs += $count;
    }
    return [$ips, $pvs];
}

4、如何计算online数

访问记录在十分钟以内的即算作在线

$onlineMin = $now - 10 * 60;

直接列上SQL语句

SELECT * FROM `wnzz_visit` WHERE `time`>{$onlineMin } AND `siteid`={$siteid};

三、代码实现

JS插件端

在这之前需要引用

<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>

jQuery库,通过这个插件我们可以在 id 为 wnzz 和 wnzz1 的div中显示返回信息

domain1改成自己服务器接口地址

// https://pv.sohu.com/cityjson?ie=utf-8

var domain1 = "http://127.0.0.1/vsCode/wnzz/";
var url = window.location.href;
var siteid = 1000;

$.get(domain1 + "?ip=" + returnCitySN["cip"] + "&cname=" + returnCitySN["cname"] + "&url=" + url + "&siteid=" + siteid, function(result){
    console.log(result);
});
$.get(domain1 + "?act=get&siteid=" + siteid, function(result){
    $("#wnzz").text(result);
    $("#wnzz1").text(result);
});

PHP后端

在这之前需要引用 Bean.class.php、Tools.class.php

imgBeanANDTools.zip

下载之后直接引用即可

以下为wnzz服务端接口

<?php
// ============================ //
//                              //
//        数据库参数配置         //
//                              //
// ============================ //
define("DB_HOST", "127.0.0.1");
// 数据库地址
define("DB_USER", "root");
// 数据库用户名
define("DB_PASSWD", "root");
// 数据库密码
define("DB_NAME", "wnzz");
// 数据库名
//设置北京时间为默认时区
date_default_timezone_set('PRC');
//输出当前时间
// echo date("Y-m-d H:i:s",time());  //2016-08-11 10:30:32
//获得当日凌晨的时间戳
// $today = strtotime(date("Y-m-d"),time());
require_once "./Tools.class.php";
require_once "./Bean.class.php";
/**
 * ip
 * cname
 * url
 * siteid
 */
/**
siteid 
1000-1999 我的字段
*/
// 存储访客数据
if(isset($_GET['ip']) && isset($_GET['cname']) && $_GET['url'] && $_GET['siteid']) {
    $ip = anti_sqlin($_GET['ip']);
    $cname = anti_sqlin($_GET['cname']);
    $url = anti_sqlin($_GET['url']);
    $siteid = (int)$_GET['siteid'];
    $bean = new Bean();
    // 现在的时间戳
    $now = time();
    // 存储
    $bean->save("wnzz_visit", ["ip={$ip}", "cname={$cname}", "url={$url}", "time={$now}", "siteid={$siteid}"]);
    // 获取访问记录
} elseif(isset($_GET['act']) && $_GET['act'] == 'get' && isset($_GET['siteid'])) {
    $siteid = (int)$_GET['siteid'];
    // init
    $y_ips = 0;
    $y_pvs = 0;
    $t_ips = 0;
    $t_pvs = 0;
    $online = 0;
    $bean = new Bean();
    // 现在的时间戳
    $now = time();
    // 现在对应今日0点的时间戳
    $today = strtotime(date("Y-m-d"), $now);
    // 现在对应昨日0点的时间戳
    $yesterday = $today - 86400;
    // 现在对应明日0点的时间戳
    $tomorrow = $today + 86400;
    // 查找昨天的记录
    $res = $bean->findByX(['timestr', 'ips', 'pvs'], "wnzz_cal", ["timestamp={$yesterday}", "siteid={$siteid}"]);
    if($res['status'] == 'data') {
        // 有数据直接读
        $y_ips = $res['data'][0]['ips'];
        $y_pvs = $res['data'][0]['pvs'];
    } else {
        // 计算并存储
        $res_m = $bean->findByX(['ip'], "wnzz_visit", ["time>={$yesterday}", "time<{$today}", "siteid={$siteid}"]);
        $datas = $res_m['data'];
        $ipsandpvs = cal_ipandpv($datas);
        // 存储
        // $ips
        // $pvs
        // $yesterday
        // $yesterday_timestamp
        $ips = $ipsandpvs[0];
        $pvs = $ipsandpvs[1];
        $yesterday_timestamp = date("Y-m-d", $yesterday);
        $y_ips = $ips;
        $y_pvs = $pvs;
        $res1 = $bean->save("wnzz_cal", ["ips={$ips}", "pvs={$pvs}", "timestamp={$yesterday}", "timestr={$yesterday_timestamp}", "siteid={$siteid}"]);
        // print_r($res1);
    }
    // 查找今天的记录
    $res_t = $bean->findByX(['ip'], "wnzz_visit", ["time>{$today}", "time<{$tomorrow}", "siteid={$siteid}"]);
    $datas_t = $res_t['data'];
    $ipsandpvs_t = cal_ipandpv($datas_t);
    $ips_t = $ipsandpvs_t[0];
    $pvs_t = $ipsandpvs_t[1];
    $t_ips = $ips_t;
    $t_pvs = $pvs_t;
    // 获取当前在线,10min内为在线
    // 用PV计算当前在线数
    $onlineMin = $now - 600;
    $res_o = $bean->findByX(['ip'], "wnzz_visit", ["time>{$onlineMin}", "siteid={$siteid}"]);
    $datas_o = $res_o['data'];
    $ipsandpvs_o = cal_ipandpv($datas_o);
    $ips_o = $ipsandpvs_o[0];
    $pvs_o = $ipsandpvs_o[1];
    // $t_ips = $ips_o;
    $online = $pvs_o;
    // $y_ips = 0;
    // $y_pvs = 0;
    // $t_ips = 0;
    // $t_pvs = 0;
    // $online = 0;
    echo "webpro统计|今日IP[{$t_ips}]|今日PV[{$t_pvs}]|昨日IP[{$y_ips}]|昨日PV[{$y_pvs}]|当前在线[{$online}]";
}
/**
 * @return array(ips, pvs)
 */
function cal_ipandpv($datas) {
    // echo "emmm<br/>";
    // print_r($datas);
    // $ip['192.168.1.1'] = 10;
    $ip = array();
    foreach($datas as $index => $item) {
        if(array_key_exists($item['ip'], $ip)) {
            // 统计过
            $ip[$item['ip']] += 1;
        } else {
            // 没统计过
            $ip[$item['ip']] = 1;
        }
    }
    // 累加IP和PV
    $ips = 0;
    $pvs = 0;
    foreach($ip as $keyip => $count) {
        $ips++;
        $pvs += $count;
    }
    return [$ips, $pvs];
}
function anti_sqlin($data) {
    $data = str_replace("'", "", $data);
    return $data;
}

HTML文档页面安装

在head代码处添加、或者有的网站后台管理中留有网站统计填写等合适位置,添加如下代码

xxx/xxx.js改成自己的服务器上的JS地址

<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
<script src="https://xxx/xxx.js"></script>

然后在你需要显示统计数据的地方添加如下div标签

<div id="wnzz"></div>

如果你有两处需要显示,可以修改下JS插件代码,增加一条语句即可

$("#wnzz1").text(result);
<div id="wnzz1"></div>

插件测试

安装好后,刷新网站进行测试

安装成功!

如果想实现多用户,自己做个siteid管理即可,从而避免siteid重复导致数据混乱。


MySQL PHP JavaScript HTML
  1. Nzhbgt 今天

    where to buy nizoral without a prescription - order itraconazole 100 mg sale order sporanox sale

  2. Qlrlme 前天

    buy semaglutide 14mg for sale - order glucovance for sale order desmopressin

  3. Dtfzau 前天

    terbinafine pill - order grifulvin v online cheap buy generic grifulvin v online

  4. Jfukax 4 天前

    purchase prandin for sale - order generic prandin 1mg buy empagliflozin without prescription

  5. Lxmlrq 5 天前

    buy generic glucophage 500mg - buy generic sitagliptin for sale precose over the counter

  6. Cbzwql 6 天前

    buy generic glyburide 5mg - glucotrol canada dapagliflozin 10 mg generic

  7. Hjzsor 8 天前

    clarinex 5mg generic - buy generic beclamethasone online albuterol medication

  8. Bdadnp 9 天前

    oral methylprednisolone cost - depo-medrol cheap buy generic azelastine 10ml

  9. Xatuax 11 天前

    buy albuterol 4mg pills - purchase seroflo pill buy theo-24 Cr paypal

  10. Igfrcs 12 天前

    ivermectin 3 mg for people - aczone pills cefaclor 250mg pill

  11. Prnizj 14 天前

    buy cleocin generic - buy cefpodoxime for sale buy chloramphenicol tablets

  12. Rgmmmx 14 天前

    azithromycin 500mg for sale - floxin 400mg brand ciprofloxacin 500mg us

  13. Zhyfmj 20 天前

    amoxicillin oral - cefadroxil 250mg cost oral cipro 500mg

  14. Xmsnxl 20 天前

    augmentin 375mg usa - brand acillin buy ciprofloxacin 500mg online cheap

  15. Jchgdu 23 天前

    buy hydroxyzine 10mg generic - buy pamelor sale cost amitriptyline 10mg

  16. Sxoifi 24 天前

    where to buy clomipramine without a prescription - mirtazapine 30mg cost order sinequan 25mg sale

  17. Zjmmxm 25 天前

    oral seroquel - order luvox 100mg generic eskalith cost

  18. Yniycr 27 天前

    order clozapine 50mg sale - buy famotidine generic buy pepcid 40mg without prescription

  19. Yaendu 28 天前

    cost zidovudine 300mg - buy allopurinol 100mg sale

  20. Dpbuae 30 天前

    glycomet online - purchase glycomet online cheap order lincocin

  21. Ebxueq 03-23

    furosemide brand - furosemide 100mg usa captopril tablet

  22. Gvqvex 03-18

    buy ciplox sale - buy generic erythromycin online purchase erythromycin sale

  23. Zwqwrs 03-18

    buy flagyl 400mg - order generic metronidazole 200mg azithromycin 250mg for sale

  24. Fmobnz 03-15

    ciprofloxacin ca - keflex sale buy augmentin without a prescription

  25. Pnwtkf 03-14

    order ciprofloxacin online - trimethoprim price order amoxiclav sale

  26. Dzcwvr 03-13

    purchase atorvastatin pills atorvastatin 10mg uk lipitor 80mg sale

Theme Jasmine by Kent Liao And Bill

本站由提供云存储服务