码迷,mamicode.com
首页 > 其他好文 > 详细

做作业中遇到的问题--长轮询

时间:2014-07-12 13:38:21      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   使用   strong   文件   

在这次的网站设计作业开发(用Thinkphp框架进行开发)中一直都很顺利,不管是在首页的制作还是后台的开发中都没遇到过什么大的问题。然而在实现客服功能的时候却遇到了很大的阻碍。

由于不会socketio,在实现客服功能的时候用到的是现在比较常用的长轮询。长轮询实现的方式主要分为两种,一种是真长轮询,就是说浏览器通过AJAX向服务器请求一次信息,如果没有得到想要的数据就一直不断开。另一钟是伪长轮询,实现的方式为浏览器每一秒通过AJAX向服务器请求信息,来实现类似与长轮询的效果。大致来看,真长轮询的方法要优与伪长轮询,当初我是这么想的,然后再开发中却遇到了种种阻碍

 

 

真长轮询:就向上面所说的只要没得到想要的数据,AJAX请求的连接就不会断开。那服务器端是如何实现的呢?

首先在控制器中写一个死循环并设定每一秒中循环一次(减轻请求数据库的压力),接着在循环中向数据库中查询数据,如果查到数据则返回给浏览器,如果没则继续循环,直到查询要的数据。

从上面的实现方法来看,确实感觉有点小高端,但是这种写法却存在着致命的缺陷。就是对服务器的压力太大,导致有时向服务器请求数据的时候就彻底卡死,甚至连请求index.php(入口文件)都请求不下来。

 

客户端代码:

bubuko.com,布布扣

getUrl为要请求的控制器的路由地址,值为/train/index.php/Admin/Index/homegetmsg.html

 

服务器端代码:

bubuko.com,布布扣

 

 

bubuko.com,布布扣

浏览器一直向服务器端请求数据

 

bubuko.com,布布扣

请求不下来index.php(入口文件)

 

 

伪长轮询:伪长轮询的写法和真长轮询的写法类似,不过不在服务器写死循环了,改在客户端中写定时器。伪长轮询有效地缓解了服务器的压力,之前遇到的问题也就都解决了。

 

客户端端代码:

bubuko.com,布布扣

getUrl为要请求的控制器的路由地址,值为/train/index.php/Admin/Index/homegetmsg.html

 

服务器端代码:

bubuko.com,布布扣

 

bubuko.com,布布扣

浏览器每一秒去向服务器请求数据

 

通过上面的两个案例,我并不是想说明伪长轮询就比真长轮询要好,真长轮询就无法用于开发中。这两个案例只是我在开发中所遇到的,当然也会有其他人成功使用真长轮询并用于项目中的案例。

伪长轮询确实能避免真长轮询所带来的问题,但是伪长轮询所不具备的就是实时性,用户发出的数据,接收者会延迟一段较长的时间才能收到,所以伪长轮询并不适用于所有情况,在要求实时性很高的情况下,还是使用socketio,又或者使用真长轮询。

做作业中遇到的问题--长轮询,布布扣,bubuko.com

做作业中遇到的问题--长轮询

标签:style   blog   http   使用   strong   文件   

原文地址:http://www.cnblogs.com/helbing/p/3836589.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!