8赞
360
当前位置:  开发笔记 > 编程语言 > 正文

workerman中后端消息实时推送至前端的方法

下面由Workerman教程栏目来为大家介绍如何将后端消息实时推送至前端:1、前后端建立websocket的长连接,用于互相的消息推送。2、在后端监听前端推送消息后向前端通过websocket推送消息。

在下载好workerman框架源码后,我们来实现上述过程。

实现代码:

server.php

reusePort=true)
 */
$worker->count = 1;
// worker进程启动后创建一个text Worker以便打开一个内部通讯端口
$worker->OnWorkerStart= function($worker)
{
    // 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
    $inner_text_worker = new Worker('text://0.0.0.0:5678');
    $inner_text_worker->OnMessage= function($connection, $buffer)
    {
        // $data数组格式,里面有uid,表示向那个uid的页面推送数据
        $data = json_decode($buffer, true);
        $uid = $data['uid'];
        // 通过workerman,向uid的页面推送数据
        $ret = sendMessageByUid($uid, $buffer);
        // 返回推送结果
        $connection->send($ret ? 'ok' : 'fail');
    };
    // ## 执行监听 ##
    $inner_text_worker->listen();
};
// 新增加一个属性,用来保存uid到connection的映射
$worker->uidCOnnections= array();
// 当有客户端发来消息时执行的回调函数
$worker->OnMessage= function($connection, $data)
{
    global $worker;
    // 判断当前客户端是否已经验证,既是否设置了uid
    if(!isset($connection->uid))
    {
        // 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
        $connection->uid = $data;
        /* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
         * 实现针对特定uid推送数据
         */
        $worker->uidConnections[$connection->uid] = $connection;
        return;
    }
};
 
// 当有客户端连接断开时
$worker->OnClose= function($connection)
{
    global $worker;
    if(isset($connection->uid))
    {
        // 连接断开时删除映射
        unset($worker->uidConnections[$connection->uid]);
    }
};
 
// 向所有验证的用户推送数据
function broadcast($message)
{
    global $worker;
    foreach($worker->uidConnections as $connection)
    {
        $connection->send($message);
    }
}
 
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
    global $worker;
    if(isset($worker->uidConnections[$uid]))
    {
        $cOnnection= $worker->uidConnections[$uid];
        $connection->send($message);
        return true;
    }
    return false;
}
 
// 运行所有的worker
Worker::runAll();

push.php

'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);
 
 ?>

clien.html



	




运行流程:

打开cmd,运行server.php

更多workerman知识请关注workerman教程栏目。

以上就是workerman中后端消息实时推送至前端的方法的详细内容,更多请关注其它相关文章!

推荐阅读
  • 如何解决《在Kubernetes的工作节点之间共享存储/卷?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《KAFKA:60000毫秒后无法更新元数据》经验,求大佬解答? ... [详细]
  • 如何解决《C-使用ptrace和waitpid进行分段错误》经验,为你挑选了1个好方法。 ... [详细]
  • Docker的核心及安装的具体使用
    这篇文章主要介绍了Docker的核心及安装的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ... [详细]
  • Hyper-V下搭建K8S集群安装docker的方法步骤
    这篇文章主要介绍了Hyper-V下搭建K8S集群安装docker的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ... [详细]
  • Docker部署Flask应用的实现步骤
    这篇文章主要介绍了Docker部署Flask应用的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ... [详细]
  • 有关于JSON的一些资料 ... [详细]
  • 如何解决《为什么docker报告没有这样的文件或目录:未知》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《如果容器立即退出,是否探索Docker的映像文件?》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《Angular6SpringBootPOST问题》经验,为你挑选了1个好方法。 ... [详细]
  • 如何解决《带有Laravel的PHP应用服务器》经验,应该怎么弄,您有好建议吗? ... [详细]
  • 谈谈.net对象生命周期(垃圾回收)
    这篇文章主要介绍了谈谈.net对象生命周期(垃圾回收),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ... [详细]
  • asp.net core应用docke部署到centos7的全过程
    这篇文章主要给大家介绍了关于asp.netcore应用docke部署到centos7的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 ... [详细]
  • 这篇文章主要介绍了CentOS下对shell脚本加密的二种方法,本文介绍了gzexe、shc两款加密工具,并分别讲解了加密方法,需要的朋友可以参考下 ... [详细]
  • 最近在学习一些基本的Linux指令,在这里总结一下,在搭环境中常用的一些指令,熟悉这些指令就基本能够使用CentOS进行日常操作了 ... [详细]
devbox
李敖书-橱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4