thinkphp整合使用Workerman(web-msg-se
参考网址:
ThinkPHP5.1 使用 web-msg-sender 实现WEB消息推送实例讲解
https://blog.csdn.net/u011415782/article/details/100727827?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242
https://github.com/walkor/web-msg-sender
https://blog.csdn.net/h330531987/article/details/78081392
https://www.myfuuun.com/post/20200151.html
https://www.programminghunter.com/article/2055243073/
https://www.workerman.net/download
web-msg-sender简介: web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推送。 通过后台推送消息,消息可以即时推送到客户端,非轮询,实时性非常好,性能很高。
环境
PHP5.5.12
thinkphp3.2.3
安装/实现步骤
以我的实际操作为例,简单过程如下:
composer 后需要在入口文件增加require './vendor/autoload.php';
1.安装 workenMan
我是直接打开项目根目录 并在根目录中使用composer 安装 composer require workerman/workerman
也可以参考:
【参考手册检查/安装workerman环境 】或者 【ThinkPHP5.1 安装 workerman 指导】
2.下载 web-msg-sender ,并解压缩到任意目录
我是解压到了 ./vendor/
官方 【web-msg-sender下载地址】或者【百度网盘备份 提取码:mz20 】,以我的操作为例,解压后的源码放在目录 "/vendor"
下
3.消息接收页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;">
<div>
<button type="button" class="layui-btn layui-btn-primary layui-btn-radius">我就是我,不一样的烟火!</button>
<br> <br> <button type="button" class="layui-btn layui-btn-normal layui-btn-radius btn-login-uid">百搭按钮</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-radius btn-msg-sender">HELLO</button>
<button type="button" id="online_box" class="layui-btn layui-btn-primary layui-btn-radius">我就是我,不一样的烟火!</button>
</div>
</fieldset>
</div>
</body>
</html>
<script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
<script src='//cdn.bootcss.com/jquery/1.11.3/jquery.js'></script>
<script>
$(document).ready(function () {
console.log("start");
// 使用时替换成真实的uid,这里方便演示随便写的
var uid = '1';//可自定义
// 连接服务端
var socket = io('http://'+document.domain+':2120');//如果需要修改这个2120 则去 web-msg-sender文件下的start_io.php 搜索并修改 再次重启服务
// 连接后登录
socket.on('connect', function(){
socket.emit('login', uid);
$(".btn-login-uid").html("用户ID:"+uid);
console.log("connect");
});
// 后端推送来消息时
socket.on('new_msg', function(msg){
//可以在这里自定义需要实现的业务
$('.btn-msg-sender').html('收到消息:'+msg);
console.log("connect");
});
// 后端推送来在线数据时
socket.on('update_online_count', function(online_stat){
console.log('online_stat:'+online_stat);
$('#online_box').html(online_stat);
});
});
</script>
4.后台推送代码
<?php
namespace Demo\Controller;
use Think\Controller;
header('Content-Type:text/html;charset=utf-8');
class WorkermanController extends Controller{
/**
* 展示页面
*/
public function demo(){
$this->display();
}
/**
* 推送
*/
public function push()
{
// 指明给谁推送,为空表示向所有在线用户推送
$to_uid = '1';
// 推送的url地址,上线时改成自己的服务器地址
$push_api_url = "http://lhygtest.com:2121/";//2121不可变 lhygtest.com 对应你自己的
$post_data = array(
'type' => 'publish',
'content' => '数据',//推送信息可自定义 如果是数组则需要转换为json数据
'to' => $to_uid,
);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
curl_setopt ( $ch, CURLOPT_HTTPHEADER, array("Expect:"));
$return = curl_exec ( $ch );
curl_close ( $ch );
var_export($return);
}
}
5.运行web-msg-sender服务
linux系统 cd 到到框架目录里运行: php start.php start -d;
windows 系统进入到框架目录里双击 "start_for_win.bat" 文件启动
image.png
6.测试效果
打开发送方页面、接收方页面,进行消息发送测试即可
image.png image.png
常见问题:
如果通信不成功检查防火墙
/sbin/iptables -I INPUT -p tcp --dport 2120 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 2121 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 2123 -j ACCEPT
发现在linux中运行会报时区错误,所以要在这个文件中设置时区
image.pngimage.png