常轮询的方式(Frequent polling)

常轮询的方式:

  • 长连接

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

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

  • Flash socket

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

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

  • 轮询

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

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

  • 长轮询

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

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

  • websocket

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

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与内存

————————

Regular polling mode:

  • Long connection

That is, the server is constantly in contact. The PHP server uses ob series functions to constantly read and output, but it consumes server resources.

That is, the server is constantly in contact. The PHP server uses ob series functions to constantly read and output, but it consumes server resources.

  • Flash socket

Flash AS3 language, create a socket server to process information.

Flash AS3 language, create a socket server to process information.

  • polling

As the name suggests, it is to keep sending query messages and updating as soon as there are new messages, but there will be many useless requests. (point bandwidth, CPU and memory consumed by the client)

As the name suggests, it is to keep sending query messages and updating as soon as there are new messages, but there will be many useless requests. (point bandwidth, CPU and memory consumed by the client)

  • Long polling

It is an upgraded version of polling and requires the cooperation of the server. (the server consumes CPU and memory)

It is an upgraded version of polling and requires the cooperation of the server. (the server consumes CPU and memory)

  • websocket

The communication function of HTML5 establishes a special interface WS protocol with the server to communicate. Compatibility may become a problem

The communication function of HTML5 establishes a special interface WS protocol with the server to communicate. Compatibility may become a problem

Server side implementation of long polling:

Database: flag bit, whether the record content has been pushed_ read
PHP:

Set timeout and current time zone

The timeout here will not take effect because PHP ini nginx. COF has timeout settings

//关于循环中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毫秒后接着去请求去 注意是方法名不还()
}

After doing this, be sure to test and pay attention to the server cup and memory