又造了个轮子
网站(页面)访问量统计是一个很有用的东西,但是每一个网站都自己实现一遍感觉很蠢。就为了统计访问量,明明一个select就能解决的事情偏偏还要跟上一个update,大部分时间都花在了不那么重要的事情上了(尽管这个时间短到可以忽略不计);而且这个访问量统计统计的应该是真人的访问,内置在网站程序中结果就是大部分的浏览量都是爬虫,访问量沦为一个意义不大的数字。
之前,一直用的都是不蒜子,部署方便、免费、简单可依赖。但是用着用着就出现了一些瑕疵:博客里宣称的注册功能搁置了一年之久,想要对网站进行一些诸如修改域名,访问量初始化的操作需要联系作者;页面访问量统计也是不包含参数的,诸如view.php?id=2这种会被统一成view.php记录,失去了页面访问量统计的意义,不是每一个网站都采用了静态化。
其他的诸如CNZZ之类的统计平台虽然可以显示访问量,但是毕竟是商业平台,非得打打广告,把自己的logo展示出来,不能自定义样式,不能忍。咨询了作者,作者说很多情况下url会被加上小尾巴,比如从微信分享页面过来的访问,不蒜子不区分参数。但是,最近的一个项目需要用到访问量统计,于是自己造了个轮子,来支持可自定义参数的统计。同时,为了做到参数设置的权限控制,加上了用户模块,也为将来用户对网站的修改做铺垫。
网站地址:PV Counter
项目开源,newnius/PV-Counter,有稳定性需求的可以自己部署,个人能力毕竟有限。
设计
数据库选型
系统用了 Redis 和 Mysql,Redis用来做访问量统计,Mysql用于存储用户及网站信息。
系统设计
用户存储暂且不表。
访问量统计方面,主要分为模式存储和访问量存储。
模式存储:采用了集合set,网站根地址base64之后作为key,相对路径作为value,统计的过程中将集合中所有模式取出,跟欲统计的网址依次对比,有匹配的就用该模式中的参数重写实际网址。
访问量存储:采用hash结构,网站跟地址base64之后作为key,重写后的相对网址作为value,每次用hincrby增加数目。
24小时内的访问量统计:由于hash不支持对单个value设置超时时间,所以采用了string,并且为了节省空间,暂时没有统计某个页面的24小时访问量统计。目前24小时是按照东8区(中国)的时区来进行统计的。
使用
注册用户与非注册用户
用户可以选择注册或者不注册,直接开始使用。区别在于不注册的情况下统计策略跟不蒜子一样忽略参数。
着重介绍一下注册用户的操作:
- 首先,点击右上角的登录/注册链接,登录后进入后台;
- 点击“Sites”进入站点管理页面;
- 点击“Add”参考示例添加网站域名和端口;
- 为了避免用户修改其他人网站的统计策略,需要验证网站所有权,在列表中点击“Verify”,根据提示,在网站根目录下创建一个指定名称的文件,之后点击“Verify”等待验证。注意:文件名是随机生成的,每次都不一样,中途不要关闭弹出框;
- 验证成功后,点击列表里的“Patterns”进入模式管理页面;
- 点击“Add”添加模式,在输入框中输入按照实例填写,如:/view.php?ID=?&SID=? (参数顺序随便),“=”号后面的值可以随便填写;
这样下次访问目标站点时,就会根据指定的模式统计了。
注意:模式中的参数在实际url中是必须存在的,否则会按照未指定模式进行统计
部署
注册和非注册用户的部署方式是一样的。
使用上,跟不蒜子类似,都是在需要统计的页面加入一行js引用。
1 | <script async src="//cdn.newnius.com/ana/ea.js"></script> |
然后,在页面上想要显示统计量的地方设置一个span等标签,设置class 为 cr_count_pv
,访问时就会被自动替换成访问量了。
不蒜子用的是id,考虑到可能出现同一页面可能多个地方都要显示访问量的情况,我改用了class。
目前支持的class及含义
class | 含义 |
---|---|
cr_count_pv | 页面访问量 |
cr_count_site_pv | 全站访问量 |
cr_count_site_pv_24h | 24小时内的全站访问量 |
cr_count_vv | 网站访问次数 |
cr_count_vv_24h | 24小时内网站访问次数 |
暂时没有统计UV,因为目前的代码里没有给用户设置跟踪COOKIE。
测试
非注册用户没什么好说的,看数字就行,测试主要是针对注册用户的指定模式。打开请求页面,找到hi.php这条请求,查看返回的json串,可以根据page的值查看设置是否是正确的。
例如 设置的模式是 “/view.php?ID=?&SID=?”,实际访问的地址是 “/view.php?SID=2&ID=3&ref=blog.newnius.com”,那么返回的就应该是类似”/view.php?ID=3&SID=2”这样的,抛弃了ref参数。
未来规划
想要拓展的地方还有很多,奈何时间不充裕啊(时间都去哪啦~~~)
- 对UV的支持 (这个做完啦!)
- 后台能看每一个页面的访问量 (这个也做完啦!)
- 记录具体的访问(做成分析平台?),日后有了数据自己分析 (这个不打算做了。。。)
- 清晰的文档(现在基本没有文档可言)
- 各种脑洞大开的想法