ajax 异步长连接遭遇堵塞,“排序执行请求”的问题解决
今天开发一个网页聊天程序,利用AJAX保持着一个长连接监听新的聊天信息,之后又调用了另外一个AJAX来发言,于是就发生了一个AJAX线程被阻塞的问题。
在未监听到新的聊天信息的之前,发言用的AJAX就无法发出。
问题描述:

上图中
第一个链接是长连接(监听新聊天信息使用的)AJAX连接,每次连接时间为30秒;
第二个链接是发言用的AJAX连接,请求后实时返回结果。
遇到的问题就是第一个链接发出后,在第一个链接没有执行完毕(也就是没有返回结果前),这段时间内如果执行第二个链接,需要排队,等第一个执行完,才会执行。
这里就郁闷了,以为是JS的原因:“JS是不是AJAX只能单线程发送?”
因为上述问题,以及推测的答案,百度、谷歌了一下午,看了好多技术文章,直接崩溃,无法解决。
难道要使用“轮询”方式解决这个问题?但是这样会造成很多网络资源浪费,因为3秒定时请求一次,然后打开多个网页的情况下,基本就是几百毫秒就请求一次了。
什么是“轮询”?
就是使用JS定时循环执行函数,每隔几秒向服务器请求一次,看有没有新消息,如果有就获取过来。
解决方法:
晚上吃完饭,回来继续百度
一、百度搜索:“异步长连接遇阻塞”,发现一篇文章《异步长连接遇阻塞,探索,以及解决 》:http://blog.csdn.net/guoerwei/article/details/6535389
看完此文后得出一些线索:
问题不是出在JS上,问题在于PHP程序上! 因为session的出现,导致了无法正常工作。直接将session先删掉,发现长连接已经不堵塞了。
原因是长连接死循环的时候,session文件被一直打开着,处于被锁定的状态,这时来发送消息,会因为session而阻塞……
二、至此,问题解决,那么上面我们的解决办法是,直接删掉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:
------------
Calling session_start() appears to wait until other scripts have exited that are using the same session. My guess is the 1st request locks the
session file 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.
本文为作者原创:
ajax 异步长连接遭遇堵塞,“排序执行请求”的问题解决的更多相关文章
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- ajax实现长连接
项目需求:需要实时的读取日志文件里的数据,并且使用Echart实时更新折线图. 使用ajax实现客户端与服务器端的数据传输. 目的:我想通过ajax与服务器建立一个长连接,服务器会不断的传输数据给前台 ...
- ajax异步导致js方法顺序执行不了
js两个方法调用的顺序,有时候是这样的 f1(); f2(); 本来是先执行f1的,但是如果f1里面进行ajax异步 async:true,那么可能会先执行f2,如果想要顺序执行,那么就把异步设 ...
- Ajax长连接和SignalR(刷新客户端数据)的区别
ajax实现长连接 <%@ page language="java" import="java.util.*" pageEncoding=" ...
- Web 通信 之 长连接、长轮询(转)
Web 通信 之 长连接.长轮询(long polling) 基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强 ...
- Web 通信 之 长连接、长轮询(long polling)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
- Web 通信 之 长连接、长轮询(long polling)(转)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
- [转]Web 通信 之 长连接、长轮询(long polling)
本篇文章转载自Web 通信之长连接.长轮询(longpolling),版权归作者所有. 转者按:随着技术的发展,在HTML5中,可以通过WebSocket技术来完成长连接的开发,虽然如此,本文依然存在 ...
- Web 通信 之 长连接、长轮询(long polling)(转载)
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...
随机推荐
- php利用反射机制查找类和方法的所在位置
//参数1是类名,参数2是方法名 $func = new ReflectionMethod('UnifiedOrder_pub', 'getPrepayId'); //从第几行开始 $start = ...
- 【iOS】自己定义TabBarController
一.自己定义的思路 iOS中的TabBarController确实已经非常强大了.大部分主流iOS应用都会採用. 可是往往也不能满足所有的需求,因此须要自己定义TabBar,自己定义须要对系统的Tab ...
- windows下的定时任务设置详解
windows下的定时任务设置详解 一.总结 一句话总结: 1.php.exe是什么? 就是php中自带的一个exe,不是我们写的,这个exe是可以执行其他的PHP的 二.windows下的定时任务设 ...
- iis配置反向代理oss
windows利用iis配置反向代理实现ECS内网互通oss IIS实现反向代理 新建两个站点,端口分别使用 80 和 81,在DNS中新建A记录,指向该计算机(10.4.34.41) 配置过程如下: ...
- JSP的C标签遍历Map数据
JSP的C标签遍历Map数据 Map可以实现较为丰富的数据封装. 第一种: 控制器传递到页面的map格式如下: Map<String, User> dataMap = new HashMa ...
- 详细阐述Web开发中的图片上传问题
Web开发中,图片上传是一种极其常见的功能.但是呢,每次做上传,都花费了不少时间. 一个"小功能"花费我这么多时间,真心不愉快. So,要得认真分析下原因. 1.在最初学习Java ...
- wpf DoEvents
原文:wpf DoEvents 如果在执行一段卡UI的代码,这时如何让UI响应.如果存在代码需要获得依赖属性,那么代码就需要在UI线程执行,但是这时就会卡UI,为了让UI响应,所以就需要使用DoEve ...
- Arcgis api for javascript学习笔记(4.5版本) - 本地部署及代理配置
在开发过程中,由于api的文件比较多,没必要每个项目都将api加入到解决方案中.况且在VS中如果将api加入解决方案,在编写css或js代码时,由于智能提示需要扫描脚本等文件,会导致VS很卡.所以个人 ...
- 树莓派的rc.local档(设置开机)
为了树莓派执行命令或程序时启动.需要被添加到顺序rc.local档.这是为那些谁执行后,直接要权力树莓派没有配置.或者不希望每次都手动启动该程序很实用. 的方法是使用cron和crontab. EDI ...
- scipy 图像处理(scipy.misc、scipy.ndimage)、matplotlib 图像处理
from scipy.misc import imread / imsave / imshow imresize / imrotate / imfilter 1. scipy.misc 下的图像处理 ...