在本系统中,消息的推送使用了 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) 消息推送的实现相关推荐

  1. App推送推了10万打开100?3招提高消息推送(Push)到达率

    消息推送(push)是App提醒或唤醒用户的方式之一也是App运营的渠道之一,运用得当可以帮助产品运营人员更高效地实现运营目标,相反盲目运用也会让App变得让人讨厌.因而推送(Push)的到达率越来越 ...

  2. 移动推送:灵活、高效、精准的App消息推送

    概要:移动互联网时代,手机App逐步成为一种生活方式.移动推送则是App主动触达用户的重要渠道,它可以推送消息通知,引导用户点击去往App,从而增强用户黏性,让潜在用户变成真爱粉.但由于安卓市场缺失系 ...

  3. springboot整合微信公众号(服务号)之消息推送

    前言 没必要说废话直接开整- 开始 (一)先直接上效果图 (二)开始前的准备工作 首先你得有一个公众号吧

  4. .net 服务器推送信息,.net websocket服务端开发,实现消息推送功能

    WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两点: WebSocket是一种双向通信协议,在建立连接后,WebSock ...

  5. 微信消息推送神器【一封传话】介绍,让消息推送更简单

    背景 对于很多个人开发和企业级别的软件开发来说,经常会遇到一些消息推送的场景.如设备报警消息推送.每日天气预报和大盘资讯简报推送等,例如微信公众号消息推送.钉钉消息推送等. 这里以微信消息推送举例,原 ...

  6. 国内APP消息推送机制以及微信消息延迟问题剖析

    转自:https://club.huawei.com/thread-15878044-1-1.html 一.前言 随着安卓手机以及QQ/微信/支付宝/滴滴出行/美图外卖等一大批移动通信/移动消费应用的 ...

  7. 微信公众号配置 Token 认证以及消息推送功能

    前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...

  8. openfire消息通知推送_APP消息推送功能之前端后台设计

    APP消息推送功能之前端后台设计 最近有不少小伙伴问APP消息推送功能,前端.后台如何设计的?消息系统的架构是什么样的?最近刚好做到后台消息推送这块,简单谈谈个人心得,欢迎拍砖. 消息推送是让自己的用 ...

  9. 消息推送技术干货:美团实时消息推送服务的技术演进之路

    本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...

最新文章

  1. 创建MySQL数据库
  2. Python培训基础教程都教哪些
  3. boost::hana::insert_range用法的测试程序
  4. CPU的高速缓存存储器知识整理
  5. Discuz! Ucenter API for JAVA jar包和测试代码
  6. python面部颜色分析_Python图像处理之颜色的定义与使用分析
  7. javaSE回顾---变量
  8. sql判断字段不为null_什么是NULL值
  9. 【CCCC】L3-002 特殊堆栈 (30分),nlogn维护序列中位数,STL大乱斗,有重multiset,vector+二分插入
  10. 用 Access+Outlook 来采集信息
  11. 蓝桥杯2019年第十届C/C++省赛B组第九题-后缀表达式
  12. vision应用教程中文版
  13. 人脸识别技术已成考勤门禁行业发展趋势
  14. graphpad多条不同的曲线_GraphPad绘制几种常见散点图教程
  15. 全新安装Win7的好方法
  16. 使用RecyclerView自定义实现二级联动列表
  17. win10 设置ctrl+shift 切换 中文输入法 英文输入法
  18. 【算法•日更•第十四期】信息奥赛一本通1592:【例 1】国王题解
  19. springboot2.0 的ssl证书配置
  20. 前端、框架和其他(155题)

热门文章

  1. 快速学习制作类似《部落冲突》的等距游戏
  2. ArchLinux中安装Virtualbox Guest Additions增强功能
  3. ​1000+数字化精英汇聚,3大低代码解决方案发布,奥哲低代码数字化解决方案发布会圆满落幕
  4. java-php-python-ssm一起组局校园交友平台计算机毕业设计
  5. html2canvas截屏、绘制透明图片 .png
  6. 细说JVM内存模型,含小米、腾讯、阿里
  7. yum安装论坛discuz,phpwind,博客系统wordpress,后台数据库管理phpmyadmin。
  8. 有源rc电压放大器实验报告_什么是有源器件?有源器件和无源器件怎么区分?...
  9. SQL的连表查询 详细
  10. 安装易语言后需要做的事情