前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows如何实例两个worker(socket worker 与 websocket worker如何通讯)

windows如何实例两个worker(socket worker 与 websocket worker如何通讯)

原创
作者头像
高久峰
发布2024-04-20 13:04:38
1270
发布2024-04-20 13:04:38
举报

由于widows下的php没有完善的进程控制接口,导致windows版本无法在一个启动脚本中实例化多个容器(Worker\WebServer\Gateway\BusinessWorker)进程。解决方法是使用多个启动脚本,每个脚本启动实例化一个容器。

假设初始化两个Worker实例,则创建两个启动文件 socket_server.php 和 websocket_server.php

例如: socket_server.php

代码语言:javascript
复制
...
$socket_server = new Worker("tcp://0.0.0.0:5555");
$socket_server->on....
....

websocket_server.php

代码语言:javascript
复制
 $websocket_server = new Worker("tcp://0.0.0.0:6666");
 $websocket_server->on....
 ...

启动时就可以像这样,直接启动两个脚本,(在cmd命令行中运行) php socket_server.php websocket_server.php

上面示例中初始化了两个进程,一个是socket通讯进程,一个是websocket通讯进程,然而根据你的应用实际上是要一个Worker进程,同时支持两种通讯,这样才方便websocket与socket之间的通讯。所以根据你的实际情况,应该初始化一个同时支持两种通讯方法的Worker进程。方法如下:

代码语言:javascript
复制
<?php
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
// websocket 协议的worker
$ws_worker = new Worker('Websocket://0.0.0.0:5656');
// 这里只能写1
$ws_worker->count = 1;
// websocket server 启动后在当前进程增加一个socket监听
$ws_worker->onWorkerStart = function($ws_worker)
{
    // 增加一个Socket端口的监听设备发来的数据
    $socket_worker = new Worker('tcp://0.0.0.0:5555');
    // 当设备发来数据时如何处理
    $socket_worker->onMessage = function($connection, $data)
    {
        // 这里处理设备发来的数据 $data
        // 比如像这样给所有的WebSocket连接转发数据
        global $ws_worker;
        foreach($ws_worker->connections as $ws_con)
        {
            $ws_con->send($data);
        }
    };
    // 给ws_worker添加一个属性保存socket_worker,方便获取
    $ws_worker->socketWorker = $socket_worker;
    // 执行监听
    $socket_worker->listen();
};

// websocket协议也就是浏览器发来数据时
$ws_worker->onMessage = function($connection, $data)
{
    // 假设需要转发给所有的设备
    global $ws_worker;
    foreach($ws_worker->socketWorker->connections as $socket_con)
    {
        $socket_con->send($data);
    }
};

Worker::runAll();

上面这个例子是一个进程同时监听多协议多个端口的例子,这样socket 与 websocket之间通讯就会非常方方便,直接内存调用即可。这个例子中业务罗辑为广播,socket可以使用telnet 测试,websocket用浏览器测试,telnet与浏览器之间就可以互相通讯了

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com