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请求,又没有降低实时性。

你可能感兴趣的:(jquery)