实现一个简单的服务端推送方案-实例篇Polling

原创 2013年12月05日 20:48:30

前面讲过一篇《实现一个简单的服务端推方案》,这里讲实现的实例。

这篇讲Polling,即浏览器客户端长轮循,后端PHP短轮循数据库,功能是从数据库表读取最新的记录并显示。


客户端代码,JS库为prototype.js

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script language="JavaScript" type="text/javascript" src="./prototype.js"></script>
</head>

<body>
  
<script language="JavaScript">   
  var Class = {  
    create: function() {  
      return function() {  
        this.initialize.apply(this, arguments);  
      }  
    }  
  }    
  var Comet = Class.create();  
  Comet.prototype = {  
      maxvid: 0,  
      url: './backend.php',  
      noerror: true,  
      initialize: function(){  
      },  
      connect: function(){  
          this.ajax = new Ajax.Request(this.url, {  
              method: 'get',  
              parameters: {  
                  'maxvid': this.maxvid  
              },  
              onSuccess: function(transport){  
                  var response = transport.responseText.evalJSON();  
                  this.comet.maxvid = response['vid'];  
                  this.comet.handleResponse(response);  
                  this.comet.noerror = true;  
              },  
              onComplete: function(transport){ 
                  if (!this.comet.noerror) setTimeout(function(){  
                                           comet.connect()  
                                           }, 5000);  
                  else   
                  this.comet.connect();  
                  this.comet.noerror = false;  
              }  
          });  
          this.ajax.comet = this;  
      },  
      handleResponse: function(response){  
          $('content').innerHTML += '<div>' + response['msg'] + '</div>'; 
      }  
  }
  
  var comet = new Comet();  
  comet.connect();
  
</script>

<div id="content"></div>   
 
</body>
</html>

服务器PHP代码:backend.php

<?php

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
flush();
//控制浏览器前端不要缓存结果,每次都要重新查询

$maxvid = $_GET["maxvid"];
error_log(date("[Y-m-d H:i:s]")." > "."maxvid: ".$maxvid."\n", 3 , "/usr/local/apache2219/logs/php_log");

$dblnk = mysql_pconnect('192.168.2.162:3306', 'root', 'cpyf');
mysql_select_db('app_m1p', $dblnk);

if ( $maxvid <= 0 ) {
  $result = mysql_query("select max(vid) from vdooropen");
  $result = mysql_fetch_row($result);
  $maxvid = $result[0];
}

while (1)
{
  $result = mysql_query("select * from vdooropen where vid > $maxvid order by vid desc limit 1");
  $num = mysql_num_rows($result);
  //echo $num;
  if ( $num > 0 ) break;
  usleep(10000); // sleep 10ms to unload the CPU
}

$result = mysql_fetch_row($result);

// 返回 JSON 数组
$response = array();
$response['vid'] = $result[0];
$response['msg'] = $result[0].",".$result[1].",".$result[2].",".$result[3].",".$result[4];

$responseText = json_encode($response);
error_log(date("[Y-m-d H:i:s]")." < ".$responseText."\n", 3 , "/usr/local/apache2219/logs/php_log");
echo $responseText;

flush();

?>



相关文章推荐

长轮询解决方案

长轮询解决方案作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs长轮询适合浏览器的Chat聊天、股票行情显示、股票状态更新、体育直播的结果显示等。当然,不是所...
  • chszs
  • chszs
  • 2015年06月21日 11:42
  • 10186

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读,SLEEP方式读MYSQL)

前面讲过一篇《实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读)》,那篇文章服务端利用Gearman队列来实现阻塞读,这篇服务器端用原生MySQL的Sleep函数来实现阻塞读。 ...
  • xtjsxtj
  • xtjsxtj
  • 2013年12月07日 09:35
  • 1494

PHP服务端推送技术Long Polling

Long Polling 服务端 推送

APP消息推送(APP Push)解决方案-服务端工作逻辑和实现

APP 推送概述: App推送消息是我们常见的一种app消息提醒方式。 我们的实现需要第三方的支持,实现方式是后台通过接口将Push请求发送至第三方,第三方实现在App所在设备上的推送。 APP推...
  • MikeLC7
  • MikeLC7
  • 2017年07月10日 18:33
  • 390

研究微信即时通讯的服务端、朋友圈、红包、推送等方案

博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved !即时通信:前端获得消息发送到服务端,服务端处理后通过推送的方式,...

comet4j java服务端推送消息到web页面实例

官网:http://code.google.com/p/comet4j/ 准备工作 下载服务端jar文件 Comet4J目前仅支持Tomcat6、7版本,根据...

极光推送 使用实例 (一)服务端

转载自:http://blog.csdn.net/u014733374/article/details/43560983 最近一直在做后台开发,但心里还是总惦记着Android,感觉...

极光推送 使用实例 (一)服务端

原文:http://blog.csdn.net/u014733374/article/details/43560983 最近一直在做后台开发,但心里还是总惦记着Andro...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现一个简单的服务端推送方案-实例篇Polling
举报原因:
原因补充:

(最多只允许输入30个字)