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

关于MYSQL的轮询与监控一点点小心得 好久都没有动过编程这种东西了,之前用帝国CMS帮公司建了一个在线文档系统,文档转换也一直用第三方的,经常出一些问题,又没有源码可以改可以看的,时间过去久了,越来越麻烦,只能动手自己写一个。 这次自己写的时候是用C#的,之前没接触过,过程挺累的,基本语法都不懂。不过其它的查查资料也基本都搞定了。功能类与模块都写出来了。 差一个核心的功能:MYSQL的数据监控! 因为帝国CMS用的是MYSQL, 阅读详情

前面讲过一篇《实现一个简单的服务端推送方案-实例篇Polling(服务端阻塞读)》,那篇文章服务端利用Gearman队列来实现阻塞读,这篇服务器端用原生MySQL的Sleep函数来实现阻塞读,这篇文章也是另一篇文章《使用MySQL构建一个队列表》的实例实现。


客户端代码,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>

服务器端代码,backend.php,在这里当读不到新数据时,就调用"带注释的Sleep函数"来阻塞,阻塞直到超时或线程被KILL

<?php

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

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

$dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');
mysql_select_db('test', $dblnk);

if ( $maxvid <= 0 ) {
  $result = mysql_query("select max(vid) from vdooropen");
  $result = mysql_fetch_row($result);
  $maxvid = $result[0];
  error_log(date("[Y-m-d H:i:s]")." > "."maxvid: ".$maxvid."\n", 3 , "/usr/local/apache2219/logs/php_log");
}

while (1)
{
  $result = mysql_query("select * from vdooropen where vid > $maxvid order by vid limit 1");
  $num = mysql_num_rows($result);
  if ( $num > 0 ) break;
  mysql_query("/*!999999 wait queue msg */ SELECT SLEEP(300)");
  if ( mysql_errno() != 0 ) {
    mysql_close($dblnk);  //必须先关闭
    $dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');
    mysql_select_db('test', $dblnk);
  }
}

$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();

?>

当新增加数据后,通过show processlist找到带注释的Sleep线程,并KILL掉,阻塞就会退出。增加数据代码如下:

<?php

$dblnk = mysql_connect('localhost:3306', 'root', 'cpyf');
mysql_select_db('test', $dblnk);

mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');
mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');
mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');
mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');
mysql_query('insert into vdooropen values(0, 2001, "0863030900020185","20130510-115152","D")');

$result = mysql_query("SHOW PROCESSLIST");
$num = mysql_num_rows($result);
for ($i = 0; $i < $num; $i++) {
  $row = mysql_fetch_row($result);
  if ( strstr($row[7], "wait queue msg") != NULL ) {
    echo "KILL ".$row[0] . "\n";
    mysql_query("KILL ".$row[0]);
  }
}

?>



基于树莓派的智能家居系统:从传感器到Web控制的全栈实践 物联网系统通常由感知层、网络层、平台层和应用层构成,通过传感器采集数据,经由微控制器或单板计算机处理,再通过网络协议传输至服务器。其核心原理在于实现物理世界与数字世界的连接与交互,技术价值体现在远程监控、自动化控制和数据驱动的决策优化上,广泛应用于智能家居、环境监测和工业自动化等场景。本文以树莓派作为控制中枢,结合Python Flask框架和MySQL数据库,构建了一个集环境感知、设备控制和用户认证于一体的原型系统,详细阐述了硬件选型、电路连接、多线程服务设计以及实时数据可视化等关键环节,为理解物联网项目 阅读详情

相关推荐

计算机毕业设计实战:从零构建冷链温控系统,掌握软件工程全流程

你是不是也经历过这样的时刻:对着电脑屏幕,看着“毕业设计”这个任务,感觉无从下手?选题、技术栈、代码实现、论文撰写……每一步都像是一座大山。尤其是当你在网上搜索“计算机毕业设计”时,扑面而来的要么是千篇一律的“XX管理系统”,要么是动辄几百上千的付费源码,真正能帮你理清思路、从零到一完成项目的指导却少之又少。 更让人头疼的是,很多同学会把“找到源码”等同于“完成毕设”。结果往往是,下载了一堆看不懂的代码,环境配置报错不断,最后论文答辩时,老师随便问几个实现细节就露了馅。毕业设计真正的价值,从来不是一份可以运

427

mqtt java群体推送_MQTT协议的初浅认识之推送订阅

背景了解MQTT怎么建立连接之后,现在重点来了解MQTT怎么推送,订阅两个方面。概念先见一张图: 这张图是依旧借鉴HiveMQ的图,来讲述MQTT协议的推送和订阅的过程。推送和订阅,我们很容易理解。这里里面的推送客户端和订阅客户端,在上篇文章MQTT协议的初浅认识之连接建立中也都提到过,都是属于MQTT的客户端。这里面有一个比较陌生的概念是Topic,即话题这个概念。话题这个东西在MQTT里面很灵...

weixin_33295214的博客 323

轮询、Comet与WebSocket:Web实时通信技术选型指南

实时通信是Web应用的核心能力之一,其底层实现围绕HTTP连接模型演进而来。从最基础的客户端主动拉取(轮询),到服务端挂起响应的伪推送(Comet),再到基于TCP全双工的原生协议(WebSocket),每种方案都对应特定的网络约束、浏览器兼容性与运维成本。轮询以低门槛和高容错成为兜底选择;Comet中的长轮询在老旧基础设施中仍具工程韧性;WebSocket则在现代场景中提供最优实时性,但需承担连接治理复杂度。本文结合Tornado与jQuery的轻量级实现,深入解析四种主流方案的原理差异、典型陷阱与生产级

baochuanying9531的博客 327

mysql数据往mq推送_MySQL数据实时增量同步到RabbitMQ

一、go-mysql-transfergo-mysql-transfer是一款MySQL实时、增量数据同步工具。能够实时解析MySQL二进制日志binlog,并生成指定格式的消息,同步到接收端。go-mysql-transfer具有如下特点:1、不依赖其它组件,一键部署2、集成多种接收端,如:Redis、MongoDB、Elasticsearch、RabbitMQ、Kafka、RocketMQ,不...

weixin_39616287的博客 1257

Spring Cloud Alibaba Nacos与Sentinel源码深度解析:从原理到实践

微服务架构的核心在于服务治理,其中服务发现与流量控制是保障系统稳定性的关键技术。服务发现通过管理服务实例的注册与寻址,实现服务间的动态调用;流量控制则通过限流、熔断等机制保护系统免受过载冲击。其技术价值在于构建高可用、可扩展的分布式系统。在Java生态中,Spring Cloud Alibaba提供了Nacos和Sentinel等成熟组件来实现这些能力。Nacos作为服务发现与配置中心,其核心在于AP模式下的高可用设计与推拉结合的服务更新机制;Sentinel作为流量治理组件,其基石是基于滑动窗口的精准统计

weixin_33701617的博客 584

从零构建C++在线判题系统:架构设计与安全沙箱实现

在线判题系统(Online Judge, OJ)是编程竞赛和算法练习平台的核心技术组件,其核心原理在于自动执行用户提交的代码并验证其正确性。系统通过接收用户代码、在隔离环境中编译运行、并与预期输出比对来实现自动化评测。从技术价值看,这类系统不仅需要处理高并发请求,还必须确保执行环境的安全性,防止恶意代码对服务器造成破坏。在应用场景上,它广泛服务于编程教育、技术面试和算法竞赛等领域。本文聚焦于使用C++实现一个轻量级OJ系统,重点探讨了如何利用Linux系统调用如`seccomp`和`setrlimit`构建

342

mysql pooling 作用_关于池化(pooling)理解!!!

网上看到一个池化的解释是:为了描述大的图像,可以对不同位置的特征进行聚合统计,如计算平均值或者是最大值,即mean-pooling和max-pooling我的想法是,图像做卷积以后,将图像信息(特征)变强了,这时候允许减小图像的尺寸(因为卷积增强了信息,现在又牺牲一点信息,达到数据尺寸减小但信息不一定减少),这就是类似于先做加法(卷积),再做减法(池化,典型下采样),一加一减,加的时候图像尺寸没加...

weixin_35881820的博客 923

【信息科学与工程学】计算机科学与自动化——第三百零四篇 高性能系统开发指南01

高并发:限流、熔断、降级高性能:红包拆分、多级缓存、大Key/热Key拆分、Pipeline、线程池、RocketMQ零丢失、幂等、分布式锁、集群缩容、分批入库海量数据处理:日志分表分片、跨表查询、冷热分层、大数据引擎服务器选型系统安全:网关安全、服务器安全、云存储安全、风控、监控、测试数据一致性:缓存与数据库一致性、大厂方案、蓝绿回滚、流量一致性、流程一致性项目与团队管理:流程问题、管理问题(风险、成本、人员、文档、培训)稳定性建设:上线三板斧、线上五步闭环、混沌工程、容量规划。

weixin_49199313的博客 249

PHP服务端推送技术Long Polling【转】

Long Polling与Polling概述 服务端推送技术应用越来越普遍,应用范围也越来越宽广,技术解决方案也越来越成熟且丰富。很多SNS网站的chat功能就有用到了Long Polling技术。比如fackebook, kaixin001。 Long Polling原理其实很简单,也很讨巧。与Polling相比,Long Polling客户端也许不会马上收到来自服务端的响应,需要等待一...

happy90 655

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇01

编号类型领域问题问题的数学分析(含几何学/拓扑学/代数学/数论/集合论/离散数学/概率论/统计学/其他)及数值分析及算法分析及参数列表及参数数值设计C/C++/rust/python代码软件(含编译器)及硬件资源需求(CPU/GPU/内存【NAND/DRAM/HBM/其他】/HBM、HDD、SSD、RAID卡、其他)关联知识1工作负载调度数据中心最小化总完成时间/成本。

weixin_49199313的博客 214

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 279

Apollo- 配置推送机制:长轮询与事件推送的实现原理与配置

请求路径必需 Query 参数appIdcluster推荐 Header(客户端声明最大等待时间)(全链路追踪 ID)成功响应(200)Body:Header:空响应(304)当超时且无变更时返回,客户端立即重试Apollo 官方文档 - 长轮询协议说明🔗 此链接为 Apollo 官网中文设计文档页,包含协议字段完整定义与状态码语义,长期有效。Apollo 的推送不是炫技的“黑科技”,而是一套以稳定性为底线、以兼容性为前提、以渐进式演进为核心不做假设。

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

基于J2EE的实时新闻推送系统设计与WebSocket实战

在Web开发中,实时数据交互一直是工程实践的重点与难点。从早期的短轮询、长轮询到如今主流的WebSocket,不同技术方案在实时性、服务器负载与实现复杂度上各有取舍。WebSocket作为HTML5提供的全双工通信协议,能够在客户端与服务器之间建立持久连接,为服务端主动推送提供了高效通道。在J2EE规范体系下,结合Servlet、JSP与JMS等核心技术,可以构建出稳定可靠的企业级应用。实时新闻推送系统正是这一技术的典型应用场景:新闻发布后,系统需将内容瞬间送达在线用户,涉及会话管理、并发控制、订阅关系与消

weixin_30607029的博客 470

Golang基础面试题汇总

channel、goroutine、slice、map、反射、内存、GC、Musql、Redis、ELK、K8s、Http、Https

weixin_41760738的博客 5696

web系统消息实时推送

针对于web BS系统页面实时提醒操作,每次都得发送请求访问数据库,浪费资源,故提供后台服务向前端推送

NI-HIL学习开篇

自我介绍下,四年零部件厂工作经验,一年(至今)主机厂工作经验,负责BMS/VCU方向软硬件测试。 学习目的:把握新能源汽车的测试发展趋势,顺应历史的洪流。 学习目标:1.掌握HIL开发测试流程中的IO配置、开环验证、闭环模型开发及调试、自动化测试 2.掌握第三方模型的搭建及simulink关联仿真(2019.05.21新增:需巩固练习matlab基础——2...

masonson的专栏 4177

java面试题总结(二)----java中级面试题 含答案

一、Java基础 1. 实例方法和静态方法有什么不一样? 2. Java中的异常有哪几类?分别怎么使用? 检出异常,非检出异常。检出异常需要try...catch才能编译通过。非检出异常不用try...catch也能编译通过。 RuntimeException是非检出异常,不需要try...catch也能编译通过。 IoException,SQLException等等其他所有异常都是检出...

ywl470812087的博客 12万+

三、分区配置

rk3566/rk3568 修改分区

暮云星影的博客 514

异步I/O实战:Python高性能Web服务优化指南

异步I/O是现代Web服务应对高并发I/O等待的核心机制,其本质是利用事件循环(如epoll/kqueue)替代线程阻塞,实现单线程内高效调度成千上万网络/数据库/磁盘请求。相比多线程模型,它显著降低内存开销与上下文切换成本,尤其适配Python生态中FastAPI、asyncpg、httpx、aioredis等原生异步工具链。技术价值在于提升QPS、压降P95延迟、增强系统吞吐稳定性,广泛应用于电商秒杀、实时数据看板、物联网平台等I/O密集型场景。本文聚焦真实项目中的异步I/O落地实践,涵盖连接池调优、H

weixin_33907511的博客 369

Vmware 17保姆级教程:从零部署华为enspPro模拟器(附镜像下载+配置优化)

本文提供了一份详尽的Vmware 17部署华为eNSP Pro模拟器的保姆级教程。内容涵盖从镜像下载、虚拟机导入、网络配置到深度性能调优的全过程,并针对常见启动失败、设备卡顿等故障提供了实用的排查方案,旨在帮助网络工程师和华为认证备考者快速搭建稳定高效的实验环境。

arduino9maker的博客 631

ddr3ip核心_DDR3 IP 核配置

DDR3 控制器 IP 核2.DDR3 IP核配置点击 Flow Navigator 面板下的“Project Manager -->IP Catalog”。 在“Memories & Storage Elements -->Memory Interface Generators”分类展开后,可以看到名为“Memory Interface Generator (MIG 7 ...

weixin_33049919的博客 2935

基于Celery与Redis的后台任务流系统设计与实践

后台任务(Background Tasks)与任务流(Task Flow)是现代分布式系统中的核心概念,用于处理异步、耗时的操作,确保主业务流程的响应速度与可靠性。其原理是通过消息队列(如Redis)解耦任务生产者与消费者,由独立的工作进程异步执行任务,并通过工作流引擎编排具有依赖关系的任务序列。该技术能显著提升系统吞吐量、实现业务逻辑的可靠执行与追溯,是构建高可用应用架构的关键。在物联网数据采集、电商订单处理、报表生成等场景中尤为关键。本文以生态养殖管理系统的“智能活动账本”为例,深入探讨了使用Celer

weixin_33726313的博客 481

手把手教你学simulink(95.1)--PID控制实例:基于Simulink的PID控制温度控制系统建模与仿真

温度控制是工业自动化、家用电器、医疗设备以及航空航天等领域中常见的控制问题。通过精确的温度控制,可以提高生产效率、降低能耗并确保产品质量。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于各种温度控制系统。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的温度控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 792
上一篇: MySQL的LIMIT与分页优化
下一篇: MySQL性能优化的最佳20+条经验
笑天居士
博客等级 码龄24年 292粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值