php 反向ajax实现,反向ajax

反向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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
php开发客服系统。真正的实时聊天,使用持久连接+轮询+反向ajax实现 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向浏览器推送数据) 二:ajax持久连接 + 长轮询 客服端采用第一种方式:iframe + 服务器推技术 思路: 1:新建comentbyiframe.php 该用文件使用while(true)一直连接到服务器不断开. 如果在while的过程中查到了新数据.使用ob_flush推给apache服务器.apache再用flush推给浏览器. 2:新建html页面,插入一个iframe. 该iframe的src为comentbyiframe.php。 并隐藏iframe。comentbyiframe.php获取的数据用js输出到父窗口中的某个函数.该函数把信息追加到指定的聊天窗口中 3:只要客户端收到用户发来的数据. 就显示为"xx对你说..". 客服端只要点击用户名。即可给该用户发送数据. 用户端采用第二种方式:ajax持久连接 + 长轮询 ajax持久连接:文档加载完毕后(或其他时机),使用ajax请求一个php文件 被请求的php文件通过while(true)循环.迟迟不给apache返回数据的目的. 轮询指:请求服务器的时候.如果服务器没有数据.则一直等.当服务器有数据后.就返回给客户端. 这样请求、响应过后就完成了一次HTTP请求. 还没完.客户端收到数据后又到服务器要数据.这就是轮询 就好像一个乞丐一样. 不给他钱,他就一直跟着你要. 你给他钱以后.他还不满足,又跑来找你要. 实现思路: 进入用户端后.如果没有用户名.使用setcookie设置一个用户名.然后通过ajax持久连接. 不停向服务器索要数据(即客服发送给该用户的记录). 详情:http://www.phpyan.com/home/article/350.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值