zoukankan      html  css  js  c++  java
  • 论反向ajax

    在讨论反向ajax之前,说一下我大二写的一个聊天程序,通过前端ajax不断向服务器发送请求(通过http连接),服务器进行一次数据库查询,然后返回结果,断开与服务器的链接(绝大部分都是无用的结果)来维持聊天界面的局部刷新,这种方法称为短链接轮询,对服务器造成的压力很大。

    前天又用反向ajax写了一个即时聊天程序,通过长连接和ob缓存来实现服务器到浏览器的数据传输,而这个长连接并不是想socket那样的通道,它本质也是轮询。但是ajax就很懒,也很赖皮,每次来服务器家串门(检测是否有新消息),都会喋喋不休的向服务器要数据(通过一个while死循环),直到服务器给了数据(满足了ajax的请求),这个请求才会回到浏览器。然后又死皮赖脸地来找服务器要数据服务器一次次地给,xhr又一次次地要。

    所以,ajax并不严格意义上的长链接,只是比短链接长一些,每次请求完成执行回调时,在前一次请求的基础上又立马进行一次请求,除非设置了超时;万一这个服务器很喜欢xhr,一要就给(当然这种情况是我们很喜欢的,借此只是说明一下这个长连接的本质),不就是个短链接嘛!

    然后再说说我用反向ajax碰到的问题吧,我一个死不要脸的xhr请求(所谓的长连接,检测新消息)丢过去,等了半天也没反应,然后我又丢了一个可爱的xhr小宝宝丢给服务器,可服务器并不觉得这个小宝宝可爱,小宝宝送到服务器家门口服务器都不理。很明显之前的长连接阻塞了小宝宝,但小宝宝是我异步请求的,不应该是和长连接排在一个队呀!  

    解决办法:原来我消息的发送者定义为$_SESSION['user']['nc'],在操作session时,会先经过session文件的处理,然而这个长连接已经占了(此时session文件是会被php锁上的),第二个session无法处理,就一致阻塞在服务器家门口咯!而打开这扇们的钥匙,当然是关闭session,在与服务器进行长连接时

    加上:session_write_close();问题成功解决。

    另外PHP开发即时的程序最好用socket,搭配前端的websocket,真正实现了不断开的数据即时传输,目前windows系统php虽然提供了socket接口,但还没有真正的封装,需要自己编写socket类。如果计算机网络并不是太好,可以试着使用workman这个框架,它实现了socket的封装,并且有大量可扩展的
    功能。
    
    
    心之所愿,永不相忘
  • 相关阅读:
    git did not exit cleanly (exit code 128)
    thinkphp导出csv文件,用表格输出excel
    php函数substr_replace中文乱码的替代解决方法
    javascript中的后退和刷新
    技术上有困惑,来看看“一万个小时”吧
    什么是 .live()
    为什么php+apache本地站点访问超级慢
    thinkphp学习笔记10—看不懂的路由规则
    4星|《大英博物馆中国简史》:中国古代代表性文物图解
    贾似道简单几招让凶暴的临安府太学生变温顺:4星|《宫崎市定人物论》
  • 原文地址:https://www.cnblogs.com/zgll/p/9299615.html
Copyright © 2011-2022 走看看