php 推送 微信墙,一面微信墙的诞生(4) 消息推送的实现

9f85906975f0

在本系统中,消息的推送使用了 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 ,将查询条件恢复。

9f85906975f0

图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(`

%24%7Bmessage.avatarUrl%7D

${message.nickname}: ${message.content}

`);

$('#main').append(newElement);

//让滚动条是始终在最下方

$(document).scrollTop(document.body.scrollHeight);

}

同时打开 localhost/wall/display 和 localhost/wall/client

在用户端界面下发送一条留言

9f85906975f0

图4-2 在用户端发送消息

9f85906975f0

图4-3 “墙端”成功收到消息

至此,我们已经完成了一个微信墙的功能部分,最后我们要做的就是把它接入到微信开放平台中:

9f85906975f0

图4-4 已经完成的部分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2018最新微信微信婚庆会议大屏幕3D签到抽奖摇一摇微信源码。这是我在淘宝上面花了200大洋买的,php版本5.4以上,亲测可用,上,抽奖,摇一摇。都可以使用。绝对没有问题。之前在网上花了2天时间也找了一些类似的,有免费下载的,也有包括在csdn上面用5个资源分下载类似的,发现都不能用,至少我在本地或有服务器上都没有调试成功,看了一下他们的代码,发现代码用的是公众号帐号和密码,来模拟微信登陆来获取用户信息微信已经在2016年就已经停止模似登陆了,登陆微信公众号,必须要扫描后,管理员确认后才可登陆。所以,那些代码都不能用。有些有csdn上传的这些代码基本上不能用(可能2015年前可以用,但是现在不能用),感觉太不负责任了,都是骗积分的。当时因为公司年会要弄个微信及现在抽奖活动,找这个代码也很辛苦,相信大家也一样辛苦,所以,把代码放出来,供大家下载学习使用。这个代码,我是在淘宝上买的,本身内置了第三方的微信公众号授权,所以,如果你的公众号没有微信认证也可以用,直接扫码就可以发送微信弹幕,不会出现第三方公众号信息。如果你的微信公众号认证了,就用自己的,后台可以配置,填写你的公众号appid和appsecret即可。好了,不多说了,大家下 载使用,如果不能用,我退积分。不清楚的,大家可以在评论区留言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值