zoukankan      html  css  js  c++  java
  • 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请求,又没有降低实时性。

  • 相关阅读:
    学习笔记之19-static和extern关键字1-对函数的作用
    学习笔记之18-变量类型
    学习笔记之17-预处理指令3-文件包含
    学习笔记之16-预处理指令2-条件编译
    背包问题
    kali linux 忘记root密码重置办法
    wp8数据存储--独立存储文件 【转】
    线段树入门【转】
    线段数【转】
    大数阶乘算法【转】
  • 原文地址:https://www.cnblogs.com/elonlee/p/3850902.html
Copyright © 2011-2022 走看看