其他分享
首页 > 其他分享> > 常轮询的方式

常轮询的方式

作者:互联网

常轮询的方式:

  1. 长连接

即服务器端不断开联系,PHP服务器端用ob系列函数来不停的读取输出,但是相当耗费服务器资源。

  1. Flash socket

flash的as3语言,创建一个socket服务器用来处理信息。

  1. 轮询

顾名思义就是不停地发送查询消息,一有新消息立刻更新,但是会有多次无用请求。(点带宽,客户端消耗CPU及内存)

  1. 长轮询

是轮询的升级版,需要服务器端的配合。(服务器端消耗CPU及内存)

  1. websocket

HTML5的通信功能,建立一个与服务器端的专用接口ws协议来进行通讯,兼容可能成为问题

长轮询的服务器端实现:

数据库:标记位,记录内容是否推送过 is_read
PHP:

设置超时时间与当前时区

这里的超时时间不会生效,因为php.ini nginx.cof中都有关于超时时间的设置

//关于循环中unset()反而会增加内存,这一点我没有试
//设置脚本超时时间为无限,不然在过了超时时间后脚本会自动关闭,轮询失败。
set_time_limit(0);
date_default_timezone_set('PRC');
//判断当前是否是ajax请求
if (IS_AJAX && IS_POST) {
    $i = 0;  //设置这个有个好处,就是在服务器30秒连接超时前自己释放连接
    while (true) {    //进入无限循环
        //根据条件查询数据库每次取一条数据,为了好处理
        if ('数据') {//当有未读信息时读取信息
            //是否有别的条件 -------------------
            //注意,此处要处理一下自己点赞后直接跳出循环
            if('当前是自己'){
                break;//输出信息后退出while循环,结束当前脚本
            }
            //更新当前数据状态为已读取
            if('更新成功'){
                //处理返回的数据
  
                echo json_encode('要返回的数据,注意里面必须为UTF-8');
                break;//输出信息后退出while循环,结束当前脚本
            }
             
        }
        sleep(1);//如果没有信息不会进入if块,但会执行一下等待?秒,防止PHP因循环假死。usleep一微秒等于百万分之一秒。
        if($i > 28){  //这个地方就是28秒退出循环
            break;
        }
        $i++;
    }
}

js

//这个是请求的ajax
var link = function(){
  $.ajax({
    url:url,
    type:'post',
    data:data,
    dataType:'json',
    success:ajax_callback,
    error:link  //这个地方有意思嘛,请求失败后重新发起请求
    });  
};
//这个是请求成功后的回调
var ajax_callback = function(data){
  //数据处理去吧
  setTimeout(link, 300);  //300毫秒后接着去请求去 注意是方法名不还()
}

做这个之后一定要测试注意服务器cup与内存

标签:服务器端,方式,轮询,ajax,循环,超时,请求
来源: https://www.cnblogs.com/fuqian/p/16267470.html