首页 > 代码库 > COMET技术具体实现 结合PHP和JQUERY

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