COMET技术具体实现 结合PHP和JQUERY

具体看代码,费话不说

PHP服务端

$mem = new RTMEM();
if(!$mem->conn())
  exit(‘no mem server‘);
if(!$mem->getstate())
  exit(‘moonjksrv is not runing‘);
$alminfo = $mem->get(‘alm_info‘);
if(!$alminfo)
  exit(‘no alarm‘);
$almobj = json_decode($alminfo);
if(!$almobj)
  exit(‘no json data‘);
$lastmodif = isset($_GET[‘timestamp‘]) ? $_GET[‘timestamp‘] : 0;
$currentmodif = $almobj->timestamp;
while ($currentmodif <= $lastmodif) // check if the data file has been modified
{
  usleep(1000000); // sleep 1 second to unload the CPU
  clearstatcache();
  $alminfo = $mem->get(‘alm_info‘);
  if(!$alminfo)
    exit(‘no alarm‘);
  $almobj = json_decode($alminfo);
  if(!$almobj)
    exit(‘no json data‘);
  $currentmodif = $almobj->timestamp;
}

exit(json_encode($almobj));

 

以下是JS端

//comet ajax////
var Comet = function(options){
    this.init(options);
};
Comet.prototype = {
    constructor: Comet,
    init:function(options){
        this.options = {
            url:"",
            callback:function(){}
        }
        this.options = $.extend(this.options,options||{});
        this.url = this.options.url;
        this.callback = this.options.callback;
        this.timestamp = 0;
        this.noerror = true;
        this.lock = true;
    },
    connect: function(){
        this.lock = false;
        this.ajaxLoop();
    },
      disconnect: function(){
        this.lock = true;
    },
    ajaxLoop: function(){
        if(this.url && !this.lock){
            var _this = this;
            $.ajax({
                url:_this.url,
                type:‘get‘,
                data:‘timestamp=‘ + _this.timestamp,
                dataType:‘json‘,
                cache:false,
                success:function(json){
                    _this.timestamp = json[‘timestamp‘];
                    _this.handleResponse(json);
                    _this.noerror = true;
                },
                complete:function(){
                    if (_this.noerror){
                        _this.ajaxLoop();
                    }else{
                        // if a connection problem occurs, try to reconnect each 1 seconds
                        setTimeout(function(){_this.ajaxLoop()}, 1000); 
                    }
                    _this.noerror = false;
                }
            })
        }
    },
      handleResponse: function(response){
        this.callback(response);
      },
    doRequest: function(request){
        if(this.url && !this.lock){
            $.get(this.url, { ‘msg‘: request } ); 
        }
    }
}
///////


    var comet = new Comet({
        url:‘binsrv/rt_alm.php?type=getrtalm‘,
        callback:function(json){ //接收到数据的处理
            if(typeof(page)!="undefined" && typeof(page.processAlmData)=="function")
                page.processAlmData(json);
                    }
            }); 
            comet.connect();    

这样的话,服务器查询数据有更新才会返回AJAX请求,没有更新会直到超时(PHP默认30秒超时),这时COMET会重新连接

这样大大降低了频繁的AJAX请求,又没有降低实时性。

COMET技术具体实现 结合PHP和JQUERY,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。