论反向ajax
2018-07-12 07:48:49来源:博客园 阅读 ()
在讨论反向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的封装,并且有大量可扩展的
功能。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:PHP 在WIN10 下配置
下一篇:常用排序算法
- php判断是否为json格式的方法 2020-02-24
- PHP使用Nginx实现反向代理 2020-02-15
- 详解PHP+AJAX无刷新分页实现方法 2019-12-20
- PHP中判断AJAX提交的数据的方法 2019-09-23
- ThinkPHP内置的ThinkAjax实现异步传输技术的操作步骤 2019-08-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash