小白一个,刚刚安装了workerman,前端推送数据没有问题,现在想tp的后端推送消息给指定用户,怎么推送呢?有没有源码参考一下,最好可以是tp的
是不是要安装channel组件呢,是的话怎么用呢
这个官网有呀,就是tp推给workerman 然后workerman websocket推送给前端,这个代码你看看手册啥的很好写呀
就是没找到,不知道哪个是,看了好几次手册了
百度应该都有的
worker代码: <?php
namespace app\push\controller; use think\worker\Server;
class Worker extends Server {
protected $socket = 'websocket://0.0.0.0:2346'; protected $uidConnections = []; protected $HEARTBEAT_TIME = '300';//心跳 /** * 收到信息 * @param $connection * @param $data */ public function onMessage($connection, $data) { $data = json_decode($data,false); //给connection临时设置一个lastMessageTime属性,用来记录上次收到消息的时间 $connection->lastMessageTime = time(); switch($data->type){ case 'login': //首次进入 $this->uidConnections[$data->uid] = $connection;//保存身份 $this->push_news($data->uid,$data->host); break; case 'pushNews': //消息推送 $this->push_news($data->uid,$data->host,$data->msg); break; } } /** * 当连接建立时触发的回调函数 * @param $connection */ public function onConnect($connection) { } /** * 当连接断开时触发的回调函数 * 连接断开销毁连接对象节约内存空间 * @param $connection */ public function onClose($connection) { /* unset($this->uidConnections[$connection->uid]); unset($connection); */ } /** * 当客户端的连接上发生错误时触发 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "error $code $msg\n"; } /** * 每个进程启动 * @param $worker */ public function onWorkerStart($worker) { // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符 $inner_text_worker = new \Workerman\Worker('Text://0.0.0.0:6890'); $inner_text_worker->onMessage = function ($connection, $buffer){ $buffer = json_decode($buffer,false); $res = ''; if($buffer->type == 'pushNews') { //$connection->send(json_encode($this->uidConnections)); //消息推送 $res = $this->push_news($buffer->uid,$buffer->host,$buffer->msg); } $connection->send($res ? 'ok' : 'fail'); }; $inner_text_worker->listen(); } //消息推送 public function push_news($uid,$host,$msg='') { if(isset($this->uidConnections[$uid])){ // 获取之前用户的链接 $conn = $this->uidConnections[$uid]; $conn->send(json_encode(['type'=>'push','num'=>'消息数','msg'=>$msg])); return true; } return false; }
}
php推送:
$client = stream_socket_client('tcp://127.0.0.1:6890', $errno, $errmsg, 1); $data = ['type'=>'pushNews','host'=>'host','uid'=>'user-1','msg'=>'消息内容']; //发送数据,Text协议需要在数据末尾加上换行符 fwrite($client, json_encode($data)."\n"); //读取推送结果 echo fread($client, 8192);
客户端: //消息 ws = new WebSocket("ws://www.demo.com:2346"); //发送 ws.onopen = function() { ws.send( JSON.stringify({ type: "login", host: $('nav .host').html(), uid: $('nav .uid').html(), }) ); };
//接收 ws.onmessage = function(e) { console.log(e.data); return false; var json = JSON.parse(e.data); if(json.type=='push') { //推送消息 Toastr.info("消息:"+json.msg); } if(json.hasOwnProperty('num')) { //未读消息 $('#numsview').html(json.num>0 ? (json.num>99 ? '99+' : json.num) : ''); } };
帮我看看我这个代码哪里有问题呢?前端结束发送是没问题,就是php后端发的消息内容,接收不到,我这边排查到的问题就是在后端推送的时候获取的$this->uidConnections里面存储的用户是空的
https://www.workerman.net/doc/gateway-worker/push-in-other-project.html 直接GatewayClient 简单方便
不同进程之间的 uidConnections 不共享
这个真找不到问题出在哪里,我换了WEB消息推送框架来推送消息,这个可以没问题
是不是要安装channel组件呢,是的话怎么用呢
这个官网有呀,就是tp推给workerman 然后workerman websocket推送给前端,这个代码你看看手册啥的很好写呀
就是没找到,不知道哪个是,看了好几次手册了
百度应该都有的
worker代码:
<?php
namespace app\push\controller;
use think\worker\Server;
class Worker extends Server
{
}
php推送:
客户端:
//消息
ws = new WebSocket("ws://www.demo.com:2346");
//发送
ws.onopen = function() {
ws.send(
JSON.stringify({
type: "login",
host: $('nav .host').html(),
uid: $('nav .uid').html(),
})
);
};
帮我看看我这个代码哪里有问题呢?前端结束发送是没问题,就是php后端发的消息内容,接收不到,我这边排查到的问题就是在后端推送的时候获取的$this->uidConnections里面存储的用户是空的
https://www.workerman.net/doc/gateway-worker/push-in-other-project.html 直接GatewayClient 简单方便
不同进程之间的 uidConnections 不共享
这个真找不到问题出在哪里,我换了WEB消息推送框架来推送消息,这个可以没问题