ajax轮训到其他页面继续,Ajax实现的长轮询不阻塞同一时间内页面的其他Ajax请求(同域请求)...

最近要做一个来电的弹屏功能,利用OM 系统的接口,OM系统发送请求到接口程序,分析数据添加到mysql数据库中,然后把最新的数据id 跟今日来电的总的数量存储到memcache 中。弹屏程序根据读取的memcache 中的数据  比对,比较是不是有新的请求到来。中间遇到问题是:前台在轮询等待数据的时候,页面中的其他请求被阻塞,查了好多资料,包括 apache 的mpm 模式,都没有找到原因。后来 在论坛里边查到原因:如下

实际上是不能并发访问同一个站点使用了session的页面,因为访问A页面时,session被锁住了,B页面要等A页面结束释放锁才能被执行。解决方 法就是不用session,或者session使用后立刻释放(php 使用session_write_close释放session锁)。

以下是我的具体操作的代码:

js:

function load_cdr_data() {

//获取现在的数据

var url='__MODULE__/Cdrmanage/get_cdr_info?id=';

var cdr_count = $('input[name="cdr_count"]').val();

$.ajax({

type: "POST",

dataType: "json",

async: true,

url: '__MODULE__/Cdrmanage/get_newcdr',

timeout: 80000, //ajax请求超时时间80秒

data: {

time: 80,

count: cdr_count,

}, //40秒后无论结果服务器都返回数据

success: function (data) {

//从服务器得到数据,显示数据并继续查询

if (data.status == "10") {

var title='您刚才拨打的电话。';

url=url+data.cdr_id;

open_no_savebtn_dialog('',url,title);

$('input[name="cdr_count"]').val(data.count);

new_load_cdr_data();

}

//未从服务器得到数据,继续查询 超时间了

if (data.status == "20") {

new_load_cdr_data();

}

},

//Ajax请求超时,继续查询

error: function (XMLHttpRequest, textStatus, errorThrown) {

if (textStatus == "timeout") {

new_load_cdr_data();

}

}

});

}

php 代码实现

/**

* 获取cdr 数据信息 初次加载的时候不返回数据 初次的时候count数据为0

* @access public

*/

public function get_newcdr() {

import('Vendor.phpmemcache.Memcachemanage');

$precount = I('post.count');

$time = I('post.time');

$user_id = session('USER_ID');

$host = '127.0.0.1';

$port = '11211';

$expire = '0';

$memcache_prefix = '';

$mem = new \Memcachemanage($host, $port, $expire, $memcache_prefix);

if (empty($time)) {

set_time_limit(0);

}

//无限请求超时时间 永久执行直到程序结束

//session解锁 这个地方查了好久才看到

//为了安全考虑(避免单个用户并发请求导致的session数据错乱),

//PHP采用排它锁来互斥的访问session数据

//(不管你是用session文件还是memcache存session),

//也就是说开启了session后,单个用户只能串行的访问这个站点,

//并发的请求只有一个会被立刻响应,其它都会被阻塞

session_write_close(); //session被占用导致的 排他锁机制

$i = 0;

while (true) {

$i++;

//若得到数据则马上返回数据给客服端,并结束本次请求

//操作memcache 获取数据

$cdr_info = $mem->get($user_id);

$max_id = $cdr_info['max_id'];

$count = $cdr_info['count'];

if ($count > $precount) {

//可以返回一个url 然后弹出窗体实现

$return = array('status' => '10', 'cdr_id' => $max_id, 'count' => $count);

exit(json_encode($return));

}

if ($i == $time) {

//防止程序一直执行 返回数据到前台 前台关闭之后 停止请求

$return = array('status' => "20");

exit(json_encode($return));

}

usleep(500000); //1秒 表示一秒钟判断一下数据状态

}

}

网页实时聊天之js和jQuery实现ajax长轮询

众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

[转]网页实时聊天之js和jQuery实现ajax长轮询 PHP

网页实时聊天之js和jQuery实现ajax长轮询 众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的 ...

用.NET MVC实现长轮询,与jQuery.AJAX即时双向通信

两周前用长轮询做了一个Chat,并移植到了Azure,还写了篇博客http://www.cnblogs.com/indream/p/3187540.html,让大家帮忙测试. 首先感谢300位注册用户 ...

Gevent的长轮询实现方法详解

长轮询 1.浏览网页时,浏览器会传HTTP 请求到服务器,服务器会根据请求将网页的内容传给浏览器,但是在很多的情况下,使用者会需要看到最新的即时性资讯,例如观看股票市场行情,而在以前只能靠着重新载入网 ...

实现Comet(服务器推送)的两种方式:长轮询和http流

Comet 是一种高级的Ajax技术,实现了服务器向页面实时推送数据的技术,应用场景有体育比赛比分和股票报价等. 实现Comet有两种方式:长轮询与http流 长轮询是短轮询的翻版,短轮询的方式是:页 ...

基于Ajax的长轮询(long-polling)方式

如 图 1 所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面 ...

php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)

php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...

Js和Jquery实现ajax长轮询

众所周知,HTTP协议是无状态的,所以一次的请求都是一个单独的事件,和前后都没有联系.所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,从而源源不段地获取信息. 一直以来的方式 ...

分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室

实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...

随机推荐

PSP记录个人项目耗时

PSP2.1 Personal Software Process Stage Time Planning 计划 90 ·Estimate ·估计这个任务需要多长时间 90 Development 开发 ...

.Net平台Winform两个ComboBox控件绑定同一个数据源

今天WINFROM编程遇到这么一个问题:是有关WINFORM中两个comboBox控件绑定同一个数据源的问题,在窗体的界面上有两个comboBox,我在Form1_Load中对他们做了数据绑定(具体代 ...

C++服务器设计(六):设备连接的生命周期管理

生命周期介绍 每一个服务器系统的新连接从建立开始时,均会经历多个阶段.比如连接的建立,登录的验证,退出前的资源释放等.同时在具体的消息处理中,还会遇到不可识别的消息事件,或者消息处理时出现数据错误等. ...

浅析Java RTTI 和 反射的概念

一.概念: RTTI(Run-Time Type Identification,运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,怎么理解这个Class对象呢?如果说类 ...

Redis总结(六)Redis配置文件全解

前面已经写了一些关于redis 的介绍,redis 的基本功能和用法,基本上都说了,有问题的可以去看看 http://www.cnblogs.com/zhangweizhong/category/77 ...

c# 事件的订阅发布Demo

delegate void del(); class MyClass1 { public event del eventcount;//创建事件并发布 public void Count() { ; ...

两个Integer变量a和b,值相等,a==b等于多少?

Integer a = Integer.valueOf(127); Integer b = Integer.valueOf(127);   Integer c = Integer.valueOf(12 ...

利用POST重启路由器,一直无法实现,求帮助

本帖最后由 xinaini1986 于 2014-10-20 13:03 编辑 因为路由器经常会无法上网,重启一下路由器就可以,但每次都登陆路由器管理重启路由器很麻烦,所以想通过按键精灵POST方式重 ...

Java 集合-Set接口和三个子类实现

2017-10-31 19:20:45 Set 一个不包含重复元素的 collection.无序且唯一. HashSet LinkedHashSet TreeSet HashSet是使用哈希表(has ...

为phpstorm安装右侧代码预览工具

打开设置界面,进入到plugins页面,然后再搜索codeglance,然后点击安装即可.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值