php 推送 微信墙,一面微信墙的诞生(4) 消息推送的实现
在本系统中,消息的推送使用了 Server-Send Event 技术,这是一种 HTTP 长轮询协议,可视作连接建立后,服务器将数据主动推送给客户端,HTML5已经有了支持这一技术的API。
推送服务
我设计的推送服务是这样的,服务器每3秒从数据库拉取新的留言信息,并推送给服务器。如果没有新的留言,则进入下一个3秒的等待。
在 server 文件夹新建 push.php
/**
* PHP默认执行时间为30秒
* 超过30秒就会停止运行
* 所以将执行时间设为0,也就是不限制
* 才能长时间地进行推送服务
*/
set_time_limit(0);
/**
* 允许所有域监听本服务发出的消息
* 上传到公网后应将其改成内部服务器的域名
*/
header('Access-Control-Allow-Origin: *');
//将文件类型定义为 event-stream
header('Content-Type: text/event-stream');
//关闭缓存
header('Cache-Control: no-cache');
//创建数据库实例
require('../util/database.class.php');
$db=Db::getInstance();
/**
* 时间节点
* 记录每一次推送的时间点
* 加载时初始化为当前时间
*/
$time=time();
while(true){
/**
* 只查询比时间结点更晚的消息,即还没有推送过的消息
* 顺带把留言者的消息一起查询出来
*/
$messages=$db->select("SELECT * FROM message m JOIN user u ON m.openid=u.openid WHERE m.posttime>=$time");
//如果有消息,推送给客户端
if(!empty($messages)){
//更新时间结点
$time=time();
/**
* 打包为json
* PHP_EOL表示换行符,在linux服务器中等价于 /n
*/
echo "data: ". json_encode($messages) . PHP_EOL;
//输出空行表示推送数据结束
echo PHP_EOL;
//释放数据缓冲区
ob_flush();
//推送到浏览器
flush();
}
//暂停3秒
sleep(3);
}
为方便观察,先将查询语句中的 where 条件去掉,在浏览器中打开 push.php,观察到服务器每3秒会把所有的数据输出来一次。关闭 push.php ,将查询条件恢复。
图4-1 push.php在浏览器的表现
制作“墙面”
在 display 文件夹建立 index.html
微信墙
/* 使用css 对消息进行简单布局 */
#main{
width:100%;
}
.message{
display:flex;
padding:20px 0;
width:100%;
font-size:40px;
border-bottom:dashed 1px #666;
}
.message>.avatar{
width:140px;
}
.message>.avatar>img{
width:120px;
height:120px;
border-radius:50%;
}
.message>.content{
flex-grow:1;
}
$(document).ready(function(){
//建立监听
var source=new EventSource('../server/push.php');
//服务器消息发来时,将消息整理好添加到 #main 中
source.onmessage=function(msg){
var data=JSON.parse(msg.data);
//判断解析后数据是不是数组
if(data.constructor.toString().indexOf('Array')>0)
data.forEach(function(message){
addMsg(message);
});
}
});
function addMsg(message){
var newElement=$('
.addClass('message')
.html(`
${message.nickname}: ${message.content}
`);
$('#main').append(newElement);
//让滚动条是始终在最下方
$(document).scrollTop(document.body.scrollHeight);
}
同时打开 localhost/wall/display 和 localhost/wall/client
在用户端界面下发送一条留言
图4-2 在用户端发送消息
图4-3 “墙端”成功收到消息
至此,我们已经完成了一个微信墙的功能部分,最后我们要做的就是把它接入到微信开放平台中:
图4-4 已经完成的部分
php 推送 微信墙,一面微信墙的诞生(4) 消息推送的实现相关推荐
- App推送推了10万打开100?3招提高消息推送(Push)到达率
消息推送(push)是App提醒或唤醒用户的方式之一也是App运营的渠道之一,运用得当可以帮助产品运营人员更高效地实现运营目标,相反盲目运用也会让App变得让人讨厌.因而推送(Push)的到达率越来越 ...
- 移动推送:灵活、高效、精准的App消息推送
概要:移动互联网时代,手机App逐步成为一种生活方式.移动推送则是App主动触达用户的重要渠道,它可以推送消息通知,引导用户点击去往App,从而增强用户黏性,让潜在用户变成真爱粉.但由于安卓市场缺失系 ...
- springboot整合微信公众号(服务号)之消息推送
前言 没必要说废话直接开整- 开始 (一)先直接上效果图 (二)开始前的准备工作 首先你得有一个公众号吧
- .net 服务器推送信息,.net websocket服务端开发,实现消息推送功能
WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两点: WebSocket是一种双向通信协议,在建立连接后,WebSock ...
- 微信消息推送神器【一封传话】介绍,让消息推送更简单
背景 对于很多个人开发和企业级别的软件开发来说,经常会遇到一些消息推送的场景.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,例如微信公众号消息推送.钉钉消息推送等. 这里以微信消息推送举例,原 ...
- 国内APP消息推送机制以及微信消息延迟问题剖析
转自:https://club.huawei.com/thread-15878044-1-1.html 一.前言 随着安卓手机以及QQ/微信/支付宝/滴滴出行/美图外卖等一大批移动通信/移动消费应用的 ...
- 微信公众号配置 Token 认证以及消息推送功能
前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...
- openfire消息通知推送_APP消息推送功能之前端后台设计
APP消息推送功能之前端后台设计 最近有不少小伙伴问APP消息推送功能,前端.后台如何设计的?消息系统的架构是什么样的?最近刚好做到后台消息推送这块,简单谈谈个人心得,欢迎拍砖. 消息推送是让自己的用 ...
- 消息推送技术干货:美团实时消息推送服务的技术演进之路
本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...
最新文章
- 创建MySQL数据库
- Python培训基础教程都教哪些
- boost::hana::insert_range用法的测试程序
- CPU的高速缓存存储器知识整理
- Discuz! Ucenter API for JAVA jar包和测试代码
- python面部颜色分析_Python图像处理之颜色的定义与使用分析
- javaSE回顾---变量
- sql判断字段不为null_什么是NULL值
- 【CCCC】L3-002 特殊堆栈 (30分),nlogn维护序列中位数,STL大乱斗,有重multiset,vector+二分插入
- 用 Access+Outlook 来采集信息
- 蓝桥杯2019年第十届C/C++省赛B组第九题-后缀表达式
- vision应用教程中文版
- 人脸识别技术已成考勤门禁行业发展趋势
- graphpad多条不同的曲线_GraphPad绘制几种常见散点图教程
- 全新安装Win7的好方法
- 使用RecyclerView自定义实现二级联动列表
- win10 设置ctrl+shift 切换 中文输入法 英文输入法
- 【算法•日更•第十四期】信息奥赛一本通1592:【例 1】国王题解
- springboot2.0 的ssl证书配置
- 前端、框架和其他(155题)
热门文章
- 快速学习制作类似《部落冲突》的等距游戏
- ArchLinux中安装Virtualbox Guest Additions增强功能
- ​1000+数字化精英汇聚,3大低代码解决方案发布,奥哲低代码数字化解决方案发布会圆满落幕
- java-php-python-ssm一起组局校园交友平台计算机毕业设计
- html2canvas截屏、绘制透明图片 .png
- 细说JVM内存模型,含小米、腾讯、阿里
- yum安装论坛discuz,phpwind,博客系统wordpress,后台数据库管理phpmyadmin。
- 有源rc电压放大器实验报告_什么是有源器件?有源器件和无源器件怎么区分?...
- SQL的连表查询 详细
- 安装易语言后需要做的事情