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

原创 2013年12月05日 21:08:01

前面讲过一篇《实现一个简单的服务端推方案-实例篇Polling》,那篇文章服务端的实现是不停的轮循数据库,这篇将服务器端轮循数据库改为服阻塞的方式读取队列,减轻数据库服务器的压力。


客户端代码,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['vid']    + ','
                                 + response['doorno'] + ','
                                 + response['rfsim']  + ','
                                 + response['optime'] + ','
                                 + response['ynopen']
                                 + '</div>';
      }
  }
  var comet = new Comet();
  comet.connect();
</script>
<div id="content"></div>
</body>
</html>

服务器端PHP代码,backend.php,队列使用gearman

<?php

ignore_user_abort(true);

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

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

$gmworker = new GearmanWorker();
$gmworker->setTimeout(60000);
$gmworker->addServer();
$gmworker->addFunction("getmsg", "getmsg");

if ( ($gmworker->work()) && ($gmworker->returnCode() == GEARMAN_SUCCESS) )
{
  echo $msg;
  ob_flush();  //必须有,不然是在PHP_BUFFER不会被发送到客户端
  flush();
  if ( connection_status() ) {
    error_log(date("[Y-m-d H:i:s]")." < ".$msg.",but connection aborted!\n", 3 , "/usr/local/apache2219/logs/php_log");
  } else {
    error_log(date("[Y-m-d H:i:s]")." < ".$msg."\n", 3 , "/usr/local/apache2219/logs/php_log");
  }
  //由于服务端阻塞读队列,无法感知客户端是否断开
  //所以当客户端中断后,后台PHP仍在阻塞读,这时如果队列有新的消息便会被读出但又无法送达前端,导致消息丢失
  //所以这里只能在发送后判断客户端连接状态,做特殊判断处理
}

function getmsg($job)
{
  global $msg;

  $msg = $job->workload();

  $result = "OK";

  return $result;
}

?>



相关文章推荐

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

前面讲过一篇《实现一个简单的服务端推方案》,这里讲实现的实例。 这篇讲Polling,即浏览器客户端长轮循,后端PHP短轮循数据库,功能是从数据库表读取最新的记录并显示。 客户端代码,JS库为pr...
  • xtjsxtj
  • xtjsxtj
  • 2013年12月05日 20:48
  • 1795

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

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

PHP服务端推送技术Long Polling

Long Polling 服务端 推送

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

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

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

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

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

对于页面一直监控,以前都是使用ajax请求即可,但是小并发这做法没多大问题,但是到了大并发就不太合适,如果不想自己写线程来操控就可以偷懒找一些插件,例如comet4j 下面我来演示下如何使用这个插件...

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

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

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

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

mina及时推送客户端服务端实现

  • 2015年07月10日 11:58
  • 1.37MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读)
举报原因:
原因补充:

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