如何实现对网站页面访问量的统计(javaweb和php)
一、总结
一句话总结:其实很简单啦,每访问一次那个页面对应的index函数(控制器中的那个函数)访问次数就加1就可以了。
1、javaweb中如何实现对网站页面访问量的统计?
用拦截器+定时更新
要对页面访问量统计也就是pv,主要就是拦截,写一个拦截器类实现HandlerInterceptor接口,拦截所有请求
然后拦截请求需要做的是什么?从数据库取出访问量?然后加1?这显然是不合理的,因为请求太多了,对数据库的频繁交互应该避免,
2个小时(自定义:时间越短越不容易造成访问量数据丢失)
2、thinkphp中如何实现对网站页面访问量的统计?
thinkphp中真实超级简单
每访问一次那个页面对应的index函数(控制器中的那个函数)访问次数就加1就可以了。
记得加1的时候用自增函数(setInc
)就好
二、javaweb中如何实现对网站页面访问量的统计?
我用的springmvc,大致讲讲自己的思路吧:
要对页面访问量统计也就是pv,主要就是拦截,写一个拦截器类实现HandlerInterceptor接口,拦截所有请求,但是需要注意的是,配置拦截器的时候
需要排除不拦截的请求,因为对于静态资源css,js,以及图片,还有后台管理系统我们是不需要拦截的,我们只拦截用户访问的页面,也就是你展示
给用户的那些页面,配置拦截大概这样配置
<mvc:interceptor>
<!-- 拦截路径 -->
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="后台管理url就不透露了"/><!-- 不拦截后台管理 -->
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/fonts/**"/>
<bean class="com.colin.interceptor.InterceptAllRequest"/>
</mvc:interceptor>
然后拦截请求需要做的是什么?从数据库取出访问量?然后加1?这显然是不合理的,因为请求太多了,对数据库的频繁交互应该避免,
我想的是写一个监听器,servletContextListener,监听servletContext的初始(只在服务器启动的时候被创建),服务器启动时候去数据库中取出访问量,
放到servletContext(全局的域,在其他请求中都可以取出来),然后每次一个请求都把放在servletContext中的访问量加1(这个是在拦截器中做的事情),在初始化servletContext时还需要做一个事情,开启线程定时把servletContext中的访问量存储到数据库中,如何定时执行?我想的是写一个循环,执行一次循环就让线程休眠
2个小时(自定义:时间越短越不容易造成访问量数据丢失),后来偶然看到了jdk文档中一个类,Timer,一个定时器,详细参考文档,它的访问可以实现定时执行任务,原理估计也差不多吧,这大概就是实现过程,具体代码就不贴了。有个比较严重的问题没有考虑到:由于ServletContext在内存中
只有一个对象,并发访问可能会造成线程安全问题,初步想在ServletContext中当一个线程安全的集合,数据的存取放在集合中
参考:如何实现对网站页面访问量的统计? - CSDN博客
三、thinkPHP实现新闻访问量统计
public function detail(){
$this->assign('page_title','新闻中心');
$id=I('id',0,'int');
$newsModel=M('News');
// 新闻点击量的实现,借助于setInc()函数,每访问一次新闻字段“in_on”加1
$newsModel->where(array('id'=>$id))->setInc('in_on',1);
$news=$newsModel->find($id);
$this->assign('news',$news);
$this->display();
}
在新闻详细页面控制器中加入 $newsModel->where(array('id'=>$id))->setInc('in_on',1);
$news=$newsModel->find($id);
利用setInc实现没访问一次字段‘in_on’的值加1,这里字段“in_on”的初始值为0.
转载于:
我用的springmvc,大致讲讲自己的思路吧:
要对页面访问量统计也就是pv,主要就是拦截,写一个拦截器类实现HandlerInterceptor接口,拦截所有请求,但是需要注意的是,配置拦截器的时候
需要排除不拦截的请求,因为对于静态资源css,js,以及图片,还有后台管理系统我们是不需要拦截的,我们只拦截用户访问的页面,也就是你展示
给用户的那些页面,配置拦截大概这样配置
<mvc:interceptor>
<!-- 拦截路径 -->
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="后台管理url就不透露了"/><!-- 不拦截后台管理 -->
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/fonts/**"/>
<bean class="com.colin.interceptor.InterceptAllRequest"/>
</mvc:interceptor>
然后拦截请求需要做的是什么?从数据库取出访问量?然后加1?这显然是不合理的,因为请求太多了,对数据库的频繁交互应该避免,
我想的是写一个监听器,servletContextListener,监听servletContext的初始(只在服务器启动的时候被创建),服务器启动时候去数据库中取出访问量,
放到servletContext(全局的域,在其他请求中都可以取出来),然后每次一个请求都把放在servletContext中的访问量加1(这个是在拦截器中做的事情),在初始化servletContext时还需要做一个事情,开启线程定时把servletContext中的访问量存储到数据库中,如何定时执行?我想的是写一个循环,执行一次循环就让线程休眠
2个小时(自定义:时间越短越不容易造成访问量数据丢失),后来偶然看到了jdk文档中一个类,Timer,一个定时器,详细参考文档,它的访问可以实现定时执行任务,原理估计也差不多吧,这大概就是实现过程,具体代码就不贴了。有个比较严重的问题没有考虑到:由于ServletContext在内存中
只有一个对象,并发访问可能会造成线程安全问题,初步想在ServletContext中当一个线程安全的集合,数据的存取放在集合中