在这次的网站设计作业开发(用Thinkphp框架进行开发)中一直都很顺利,不管是在首页的制作还是后台的开发中都没遇到过什么大的问题。然而在实现客服功能的时候却遇到了很大的阻碍。
由于不会socketio,在实现客服功能的时候用到的是现在比较常用的长轮询。长轮询实现的方式主要分为两种,一种是真长轮询,就是说浏览器通过AJAX向服务器请求一次信息,如果没有得到想要的数据就一直不断开。另一钟是伪长轮询,实现的方式为浏览器每一秒通过AJAX向服务器请求信息,来实现类似与长轮询的效果。大致来看,真长轮询的方法要优与伪长轮询,当初我是这么想的,然后再开发中却遇到了种种阻碍
真长轮询:就向上面所说的只要没得到想要的数据,AJAX请求的连接就不会断开。那服务器端是如何实现的呢?
首先在控制器中写一个死循环并设定每一秒中循环一次(减轻请求数据库的压力),接着在循环中向数据库中查询数据,如果查到数据则返回给浏览器,如果没则继续循环,直到查询要的数据。
从上面的实现方法来看,确实感觉有点小高端,但是这种写法却存在着致命的缺陷。就是对服务器的压力太大,导致有时向服务器请求数据的时候就彻底卡死,甚至连请求index.php(入口文件)都请求不下来。
客户端代码:
getUrl为要请求的控制器的路由地址,值为/train/index.php/Admin/Index/homegetmsg.html
服务器端代码:
浏览器一直向服务器端请求数据
请求不下来index.php(入口文件)
伪长轮询:伪长轮询的写法和真长轮询的写法类似,不过不在服务器写死循环了,改在客户端中写定时器。伪长轮询有效地缓解了服务器的压力,之前遇到的问题也就都解决了。
客户端端代码:
getUrl为要请求的控制器的路由地址,值为/train/index.php/Admin/Index/homegetmsg.html
服务器端代码:
浏览器每一秒去向服务器请求数据
通过上面的两个案例,我并不是想说明伪长轮询就比真长轮询要好,真长轮询就无法用于开发中。这两个案例只是我在开发中所遇到的,当然也会有其他人成功使用真长轮询并用于项目中的案例。
伪长轮询确实能避免真长轮询所带来的问题,但是伪长轮询所不具备的就是实时性,用户发出的数据,接收者会延迟一段较长的时间才能收到,所以伪长轮询并不适用于所有情况,在要求实时性很高的情况下,还是使用socketio,又或者使用真长轮询。
做作业中遇到的问题--长轮询