反向ajax


ajax长循环,又叫comet机制,但是我最喜欢的还是叫他反向ajax

反向ajax,顾名思义,就是不是客户端来请求服务器端,而是服务器端请求客户端,这样做的好处是节省了大量以前轮询造成的查询浪费,从而减轻数据库压力和服务器压力

那么如何实现反向ajax呢:

主体

1.在客户端写一个ajax,这个ajax里设置一个过期的时间 timeout,这个过期的时间timeout是用来暂时延长ajax的请求时间的,当这个ajax触发的时候给后台传递一个等于timeout的值。

$.ajax({type: 'POST',dataType: 'json',url: "do.php",timeout: '20000',//请求超时时间data: {'time':'2000000','user':user},// 每次请求等待时间success: function(data){//逻辑代码
})

2.在后台的php文件中,我们接受这个timeout,把这个timeout设置为php的搁置时间,这样就算挂起了php处理的这个进程了,这样做是为了和前面ajax的过期时间保持一致,从而一致保持ajax请求这个状态,也就是说在这timeout时间内

ajax的请求和php处理程序进程被挂起了

$time = $_POST['time'];
$user = $_POST['user'];
if(empty($time)) exit();
set_time_limit(0);// 无限请求超时时间
usleep($time);// 等待时间

重点

3.重点的一步:在一个while循环中处理自己的业务逻辑,然后向前端发送信息,随后退出当前的线程,这样做的意义是沾少量的内存和查最少的数据库

while(true){if(你自己的判断向客服端发送信息的条件)//send()发送信息后退出线程exit();}else{//无数据发送直接退出线程exit();         }

4.前端重要的一步:当你从后端拿出你要的东西时候,将结束上一个长循环,然后挂起下一个长循环ajax,就算你没有拿到数据过了超时时间的话也要结束当前ajax,进行下一个ajax。如果没有数据这个ajax会持续20s,这可比主动每秒访问服务器好多了,这是服务器主动推的,不是客户端每秒轮询的。

success: function(data){//逻辑代码
}
// 未从服务器中获的数据,继续搁置
if(data.success == '0'){ajax_for_while()
}// ajax超时,进入下一个push搁置机制
error:function(XMLHttpRequest,textStatus,errorThrown){if(textStatus == "timeout"){ajax_for_while()}
}

core

客户端发起一个ajax请求,服务端将请求搁置(pending)或者说挂起,直到到了超时时间(timeout)或需要推送时返回;客户端则等待ajax返回后处理数据,再发起下一个ajax请求。

这样的挂起就不是服务器每秒请求ajax的数据库了,这个timeout时间是可以更改的,多少都行。现在是20s,在20s内ajax不会不断请求数据库,或服务器,问他们有没有信息,而是一旦服务器有信息就会主动推送给客户端,而不用客户端每秒都询问了。

完整的代码

前端的

function ajax_for_while() {//AJAX长轮询$.ajax({type: 'POST',dataType: 'json',url: "do.php",timeout: '20000',//请求超时时间data: {'time':'2000000','user':user},// 每次请求等待时间success: function(data){if(data.success == '1')ajax_for_while()}// 未从服务器中获的数据if(data.success == '0'){ajax_for_while()}},// ajax超时,进入下一个push搁置机制error:function(XMLHttpRequest,textStatus,errorThrown){if(textStatus == "timeout"){ajax_for_while()}}});
}

后台的

$time = $_POST['time'];
$user = $_POST['user'];
if(empty($time)) exit();
set_time_limit(0);// 无限请求超时时间
usleep($time);// 等待时间
while(true){//在数据库中查找相应的最后条未读数据出来if(empty($user_record_array)){$arr = array('success'=>'0','error'=>'无新数据');echo json_encode($arr);exit();}else{if($user_record_array['state'] == 0){$arr = array('success'=>'0','error'=>'有数据');            echo json_encode($arr);            exit();}else{$arr = array('success'=>'0','error'=>'无新数据');echo json_encode($arr);exit();}}}

参考资料

http://www.cnblogs.com/MGer-PHP/p/3701573.html
http://blog.csdn.net/black_ox/article/details/12981195

【学无止境】ajax长循环,反向ajax初体会,不用ws实现即时聊天相关推荐

  1. spring ajax 长轮询,Ajax轮询和长轮询

    缺点:Ajax轮询需要服务器有很快的处理速度与快速响应.long poll需要很高的并发,体现在同时容纳请求的能力. 一.轮询是在浏览器客户端实现的: 如果从后端获取数据成功则停止请求. $(func ...

  2. 一个非常简单的 ASP.NET MVC 示例:长轮询(又叫:反向 AJAX,英文名:Comet)实现...

    关于 长轮询(又叫:反向 AJAX,英文名:Comet)的介绍,请查看:反向Ajax,第1部分:Comet介绍 下面是代码实现: UI: <p><input type="b ...

  3. php开发客服系统(持久连接+轮询+反向ajax)

    欢迎在php严程序 - php教程学习AJAX教程, 本节课讲解:php开发客服系统(持久连接+轮询+反向ajax) php开发客服系统(下载源码) 用户端(可直接给客户发送消息) 客服端(点击用户名 ...

  4. 【AJAX】反向Ajax第1部分:Comet介绍

    英文原文:Reverse Ajax, Part 1: Introduction to Comet 在过去的几年中,web开发已经发生了很大的变化.现如今,我们期望的是能够通过web快速.动态地访问应用 ...

  5. Comet, 下一代反向AJAX(即服务器推送技术- Server-side push)

    理解 Comet 您可能已经听说过 Comet,因为它最近受到了一定的关注.Comet 有时也称反向 Ajax 或服务器端推技术(server-side push).其思想很简单:将数据直接从服务器推 ...

  6. ajax长轮询 java web_网页实时聊天之js和jQuery实现ajax长轮询

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

  7. WEB消息提醒实现之二 实现方式-Jquery Ajax长轮询

    #Jquery Ajax长轮询 ##原理 Jquery Ajax长轮询的原理主要是,前台客户端发送ajax请求到服务器,服务器接收到请求之后会保持住连接,直到有新消息才返回响应信息并关闭连接,客户端处 ...

  8. java+jquery实现长轮询案例_网页实时聊天之js和jQuery实现ajax长轮询

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

  9. ajax长轮询tornado,Tornado长轮询和WebSocket

    Http协议是一种请求响应式协议, 不允许服务端主动向客户端发送信息. 短轮询是一种简单的实现服务端推送消息的解决方案, 客户端以一定间隔自动向服务端发送刷新请求, 服务端返回要推送的消息作为响应. ...

最新文章

  1. 7系列FPGA逻辑单元理解
  2. 应用化学C4H12Si类四甲基硅结构的神经网络
  3. mysql定位前后端问题_Web 前后端分离的意义大吗?
  4. hdu 2896 病毒侵袭
  5. 修改oracle默认日期,Oracle 修改默认日期格式
  6. 暑假攻略:怎样让孩子过一个充实又省钱的假期
  7. Cocos2d-X 2.2嵌入MFC的子窗口
  8. 隔离见证_云见证–一种使我们的生活更轻松的新功能
  9. 模拟集成电路学习心得(不见牛人,不懂世界之大!!!)
  10. inux中tail命令---用于查看文件内容
  11. 题目206-矩形的个数
  12. RPi 2B Raspbian system install
  13. authorization 传 就跨域_将Token添加到请求头Heade
  14. 武汉大学计算机学院2010情景剧,武汉大学2010届毕业生生源httpwww.xsjy.whu.edu.cn.doc...
  15. 普通笔记本/台式机安装MacOS教程
  16. 他 1 个月写了个操作系统,退休后去做飞行员!
  17. XS-Leaks漏洞
  18. B站在计算机内部,如何在Bilibili中弹幕式播放本地视频?
  19. 公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了
  20. 微信小程序:利用搜狗API实现听写单词小程序

热门文章

  1. Linux命令之whereis
  2. python执行外部命令或URL
  3. asp.net使用for循环实现Datalist的分列显示功能
  4. asp.net 中GridView控件实现全选及反选的功能
  5. ASP.NET中防止页面多次加载的IsPostBack属性
  6. 引导界面(二)使用ViewPager实现欢迎引导页面
  7. easyNeurons 神经网络入门教程
  8. 后台开发经典书籍--构建高性能WEB站点
  9. 简单而易忽视的http 404
  10. 线程:ReentrantReadWriteLock类