laravel使用web-msg-sender消息推送
大家好,猪哥已经很久没有更新文章了,今天我们来讲解下 php Workerman 的消息推送框架 web-sender-msg 先上个下载连接
安装包已经是绿色版本,直接解压到项目根目录即可使用,在使用之前要确保配置了php的环境变量
我们重点讨论Linux环境 的部署,windows 环境不在讨论范围内。下面我以宝塔面板为例演示如何配置 web-sender-msg。
首先我们要检查php的环境
运行命令:先检查系统已安装的php扩展
php -m
2. 检查禁用函数
运行命令:
curl -Ss https://www.workerman.net/check | php
如果执行命令后和上图一样 说明环境满足要求,如果出现红色列表说明需要解除禁用函数,如下图所示
你需要根据列表中提示的函数 全部解除禁用即可。
3. 最后执行 命令
curl -Ss https://www.workerman.net/fix | php
通过以上步骤 环境已经搭建成功:
下面开始测试如何开启 消息推送服务
进入到你的 web-sender-msg 的安装目录 比如 /www/wwwroot/web-sender-msg
cd /www/wwwroot/web-sender-msg
执行启动命令:
php start.php start -d
启动成功后:
如果你看到这个信息 恭喜你已经成功运行。
laravel 配置:
我们需要创建一个助手函数 来推送消息
在 help.php 助手函数中新建一个函数
if(!function_exists('webSendMsg')){ function webSendMsg($data) { // 指明给谁推送,为空表示向所有在线用户推送 $to_uid = ""; // 推送的url地址,使用自己的服务器地址 $push_api_url = "127.0.0.1:2121"; $post_data = array( "type" => "publish", "content" => json_encode($data,JSON_UNESCAPED_UNICODE), "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); } }
2121端口是推送端口,还有2120 2123 端口 ,所以我们需要开放2121、2120,2123 这3个端口 如果是阿里云,腾讯云 需要开放对应的安全组开放这3个端口,宝塔面板需要开放这3个端口
现在php 端已经就绪
下面 我们测试消息推送。下面以一段真实项目中的推送代码片段来演示如何推送消息
if ($gift['status']==1){ // 预留 消息推送 $post_data = array( "type" => "publish", 'sendMsg'=>"用户".$user['nickname']."给可爱的".$clerk['nickname']."打赏了礼物".$gift['name']."【★★★".$gift['tx_title']."★★★】", 'svga'=> cdnurl($gift['svga']), 'status'=> $gift['status'], "to" => '', ); webSendMsg($post_data); }
以上是服务端消息推送的,现在还需要客户端来进行接收
在客户端接受推送服务端信息之前 我们要探讨2个问题,一个是htts协议推送,一个是http 协议推送
下面我们重点讨论https, 如果web-msg-sender 推送域名是https 是443端口,那么web-msg-sender 消息推送 客户端是接收不到信息的,因为消息已经加密,我们需要通过443端口 转发2020端口实现内部转发客户端才能接收到消息,我们需要配置nginx 的 443 端口转发
下面我们开始配置nginx 打开宝塔面板先给域名配置ssl证书 提示下:消息推送的域名可以不用单独配置,如果你的主域名已经配置证书直接在主域名的配置文件下
进行端口转发即可。下面以主域名配置https 端口转发为例:
然后打开域名配置文件 如下图:
找到红框的代码,在它之后写入如下配置信息
location /socket.io { proxy_pass http://127.0.0.1:2120; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Real-IP $remote_addr; }
经过以上配置 就可以是https 转发 2120端口实现 消息推送
下面是客户端的连接案例,需要注意的客户端必须是能在本地运行页面,不能是本地的文件 比如loaclhost 只能在服务器环境下运行才可以
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>{$site.name|htmlentities}</title> <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> </head> <body id="page-top"> <script> // 连接服务端,https://lms.0561cc.com换成实际部署web-msg-sender服务的域名 var socket = io("https://lms.0561cc.com",{debug:true}); // uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数 uid = 123; // socket连接后以uid登录 socket.on('connect', function(){ socket.emit('login', uid); }); // 后端推送来消息时 socket.on('new_msg', function(msg){ const fixedData = msg.replace(/"/g, '"'); const userObj = JSON.parse(fixedData); console.log(userObj); }); // 后端推送来在线数据时 socket.on('update_online_count', function(online_stat){ console.log(online_stat); }); </script> </body> </html>
把上面的代码保存网页部署到服务器环境下运行这个网页 如何成功 会在控制台看到如下信息:
说明已经成功连接。
上图可以看到已经收到服务端推送的消息了!
以上是客户端接收 https 协议的配置
如果是 http协议 需要加域名和端口访问
上面的客户端代码需要修改为:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta name="author" content=""> <title>{$site.name|htmlentities}</title> <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> </head> <body id="page-top"> <script> // 连接服务端,workerman.net:2120换成实际部署web-msg-sender服务的域名或者ip var socket = io("http://101.34.154.10:2120",{debug:true}); // uid可以是自己网站的用户id,以便针对uid推送以及统计在线人数 uid = 123; // socket连接后以uid登录 socket.on('connect', function(){ socket.emit('login', uid); }); // 后端推送来消息时 socket.on('new_msg', function(msg){ //msg= JSON.parse(msg); const fixedData = msg.replace(/"/g, '"'); const userObj = JSON.parse(fixedData); console.log(userObj); }); // 后端推送来在线数据时 socket.on('update_online_count', function(online_stat){ console.log(online_stat); }); </script> </body> </html>
最后我们总结下: 如果是https 协议 域名换成实际域名
var socket = io("https://lms.0161cc.com",{debug:true});
如果是http 协议 就需要 ip换成实际ip端口默认2120
var socket = io("http://128.84.154.10:2120",{debug:true});
至此 我们的消息推送接口就成功的架设完毕,感谢您能观看到这里,祝你学习愉快,生活美满!