Workerman--后端消息实时推送至前端

    在开发过程中,我们经常会遇到如下这种情况。前端列表展示后台数据库中的数据,但是在后台的某一个接口中向数据库插入一条数据,此时数据库已更新,但是前端展示数据并没有更新,需要手动刷新才可以。但是每次都自己手动更新,太麻烦了,这时候就可以用到workerman来解决问题了。

  Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。

  那我们应该如何能使用才能解决上述问题呢?

  1.前后端建立websocket的长连接,用于互相的消息推送

  2.后端内部在建立一个监听进程(协议不限)

  3.在接口往数据库中插入数据成功后,想内部监听端口推送数据

  4.在收到内部监听端口的推送消息之后,后端在向前端通过websocket推送消息,实现刷新

 

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

上代码:

server.php

<?php
use Workerman\Worker;

require_once __DIR__ . '/../../vendor/autoload.php';


// 初始化一个worker容器,监听1234端口
$worker = new Worker('websocket://0.0.0.0:1234');//

/*
 * 注意这里进程数必须设置为1,否则会报端口占用错误
 * (php 7可以设置进程数大于1,前提是$inner_text_worker->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

<?php
//插入数据库操作



// 建立socket连接到内部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);


 ?>

 

clien.html

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<script>
	var ws = new WebSocket('ws://127.0.0.1:1234');
	ws.onopen = function(){
		var uid = 'uid1';
		ws.send(uid);
	};
	ws.onmessage = function(e){
		//alert(e.data);
		console.log(e.data);
		//window.location.reload();
	};
</script>
</body>
</html>

 

运行流程:

打开cmd,运行server.php

打开前端页面和console

 

在打开一个cmd,运行push.php

 

此时在看前端页面,console就收收到消息。

 

这就可以简单实现workerman的即时通信,具体的逻辑可以在此基础上再进行修改完善,希望可以帮到大家,谢谢。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: workerman-master是一个开源的PHP Socket服务器框架,可以用来构建高性能的TCP和UDP服务器。要下载workerman-master,可以按照以下步骤进行操作。 首先,打开workerman-master的官方仓库页面,一般是在GitHub上。在该页面上,可以找到workerman-master的源代码和相关文档。 接下来,找到一个合适的下载方式。一种方式是通过点击页面上的“Clone or Download”按钮来下载压缩包。另一种方式是使用Git命令从仓库中克隆代码到本地。 如果选择下载压缩包,可以选择zip格式或者tar.gz格式,根据个人喜好进行选择。点击下载按钮后,就会开始下载压缩包。下载过程可能需要等待一段时间,具体时间取决于网络连接速度和文件大小。 如果选择使用Git命令进行下载,需要先在本地安装并配置好Git环境。然后,在命令行中进入到想要存放workerman-master代码的文件夹,运行以下命令: ``` git clone https://github.com/walkor/HeyCommunity.git ``` 这样就会把workerman-master的源代码克隆到本地。 不管是哪种方式,下载完成后,需要解压压缩包(如果是下载的压缩包),或者进入克隆的代码文件夹(如果是使用Git克隆的)。 至此,workerman-master的下载就完成了。可以通过查看该项目的文档和示例代码,进一步了解如何使用workerman-master构建高性能的服务器。 ### 回答2: workerman-master是一个高性能的PHP Socket框架,它可以实现高并发的网络编程。要下载workerman-master,可以按照以下步骤进行操作: 1. 打开workerman的官方GitHub页面(https://github.com/walkor/Workerman)。 2. 在页面上方找到绿色按钮“Code”并点击。 3. 在弹出的菜单中,选择“Download ZIP”选项。 4. 点击“Download ZIP”后,系统将开始下载workerman-master的压缩文件。保存文件到你希望的目录中。 5. 下载完成后,找到保存的压缩文件,解压缩到指定的目录。 6. 解压缩完成后,你就可以开始使用workerman-master进行高性能网络编程了。 如果你已经安装了Git,你也可以通过以下步骤来下载workerman-master: 1. 打开终端或命令行界面。 2. 输入以下命令来克隆workerman的Git仓库: `git clone https://github.com/walkor/Workerman.git` 3. 执行上述命令后,系统将会自动下载workerman-master的代码到你当前的目录中。 4. 下载完成后,你就可以进入到下载好的workerman目录,开始使用workerman-master进行高性能网络编程了。 总结:要下载workerman-master,你可以通过GitHub页面直接下载压缩文件或通过Git克隆仓库来获取源代码。根据自己的喜好和环境选择合适的方式进行下载。 ### 回答3: workerman-master可以在GitHub上进行下载。要下载它,首先需要打开GitHub网站并搜索"workerman"。在搜索结果中找到workerman-master,单击进入该页面。 在workerman-master页面上,可以找到一个绿色的按钮,上面写着"Code"。单击这个按钮后,会弹出一个下拉菜单。在下拉菜单中选择"Download ZIP"选项,并单击它。这将会触发workerman-master的下载过程。 一旦下载完成,可以在系统的默认下载文件夹中找到对应的ZIP文件。将ZIP文件解压缩到您希望存储workerman-master的位置。然后,通过终端或命令提示符进入该文件夹。 在您打开的终端或命令提示符窗口中,输入相应的命令进行workerman-master的安装和配置。可参考workerman-master的文档和指南,根据您的需求和环境进行安装设置。 安装完成后,您就可以使用workerman-master进行开发和部署您的应用程序了。确保您已经阅读并理解了workerman-master的使用说明,并按照要求进行相应的设置和配置。通过使用workerman-master,您可以创建和管理高性能的网络应用程序。 希望这个回答对您有所帮助。如有任何问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值