ajax 长连接导致绑定事件不执行,ajax 异步长链接遭遇堵塞,“排序执行请求”的问题解决...

今天开发一个网页聊天程序,利用AJAX保持着一个长链接监听新的聊天信息,以后又调用了另一个AJAX来发言,因而就发生了一个AJAX线程被阻塞的问题。php

在未监听到新的聊天信息的以前,发言用的AJAX就没法发出。服务器

问题描述:网络

df1e27d8a9e5dff108292f36c0c41f3b.png

上图中session

第一个连接是长链接(监听新聊天信息使用的)AJAX链接,每次链接时间为30秒;app

第二个连接是发言用的AJAX链接,请求后实时返回结果。异步

遇到的问题就是第一个连接发出后,在第一个连接没有执行完毕(也就是没有返回结果前),这段时间内若是执行第二个连接,须要排队,等第一个执行完,才会执行。函数

这里就郁闷了,觉得是JS的缘由:“JS是否是AJAX只能单线程发送?”测试

由于上述问题,以及推测的答案,百度、谷歌了一下午,看了好多技术文章,直接崩溃,没法解决。this

难道要使用“轮询”方式解决这个问题?可是这样会形成不少网络资源浪费,由于3秒定时请求一次,而后打开多个网页的状况下,基本就是几百毫秒就请求一次了。spa

什么是“轮询”?

就是使用JS定时循环执行函数,每隔几秒向服务器请求一次,看有没有新消息,若是有就获取过来。

解决方法:

晚上吃完饭,回来继续百度

1、百度搜索:“异步长链接遇阻塞”,发现一篇文章《异步长链接遇阻塞,探索,以及解决 》:http://blog.csdn.net/guoerwei/article/details/6535389

看完此文后得出一些线索:

问题不是出在JS上,问题在于PHP程序上! 由于session的出现,致使了没法正常工做。直接将session先删掉,发现长链接已经不堵塞了。

缘由是长链接死循环的时候,session文件被一直打开着,处于被锁定的状态,这时来发送消息,会由于session而阻塞……

2、至此,问题解决,那么上面咱们的解决办法是,直接删掉session,可是项目作到如今,已经有不少的session了,删掉测试下,确定的没问题,可是想要直接不使用session,仍是有点麻烦,那么是否能够在不删除session的状况下解决这个问题呢?

接着百度搜索“php如何解决session封闭问题”,发现一篇文章《PHP中Session引发的脚本阻塞问题解决办法》http://www.jb51.net/article/48805.htm

从里面获得一个函数

session_write_close();

结合了PHP的Session机制,找到了阻塞的缘由。因为PHP的Session信息是写入文件的,1个客户端占有1个session文件。所以,当 session_start被调用的时候,该文件是被锁住的,并且是以读写模式锁住的(由于程序中可能要修改session的值),这样,第2次调用 session_start的时候就被阻塞了。

查了下PHP的Bug列表,发现有人提出了这个问题:

Description:

------------Callingsession_start() appears to wait until other scripts have exited

that are using the same session.My guess is the 1st request locks the

sessionfile for exclusive use,and the second request blocks until it

can open it.

PHP官方的回复是:

Thank you for taking the time to write to us, but this is not a bug.This is expected, the session file is locked to avoid corruption.

本文为做者原创:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值