写点什么

window 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

作者:极客飞兔
  • 2023-03-17
    江苏
  • 本文字数:1021 字

    阅读完需:约 3 分钟

window 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务

🎈 开启多个 ws 服务失败

  • 正常情况下,如果你想开启多个 websocket 服务的话

  • 只要在一个文件中,输入 new Worker 两次,监听不同端口,使用 Worker::runAll() 命令即可

  • 但是你会发现在在 window 中无法在一个文件中同时监听两个 websocket 服务,其他系统比如 Linux 是没有问题的

  • 会报 multi workers init in one php file are not support 错误,意思 window 中禁止在同一个文件中开启多个 websocket 服务

<?phpuse Workerman\Worker;use Workerman\Connection\TcpConnection;require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:1234");$http_worker->onMessage = function(TcpConnection $connection, $data){ $connection->send('hello http');};
$ws_worker = new Worker('websocket://0.0.0.0:2345');$ws_worker->onMessage = function(TcpConnection $connection, $data){ $connection->send('hello websocket');};
// 运行所有Worker实例Worker::runAll();
复制代码


🎈 开启服务失败解决办法

  • windows 版本的 workerman 不支持在同一个文件中实例化多个 Worker

    因此 windows 版本的 workerman 需要将多个 Worker 实例初始化放在不同的文件中才可以解决

  • 比如我们定义两个文件,一个 start_http.php,另一个是 start_websocket.php,在文件中分别加入以下代码,监听不同端口,然后使用 php 文件名 命令启动这两个文件即可

<?phpuse Workerman\Worker;use Workerman\Connection\TcpConnection;require_once __DIR__ . '/vendor/autoload.php';
// 需要监听不同的端口$ws_worker = new Worker('websocket://0.0.0.0:xxxx');$ws_worker->onMessage = function(TcpConnection $connection, $data){ $connection->send('hello websocket');};
// 运行所有Worker实例(这里只有一个实例)Worker::runAll();
复制代码


🎈 同一个窗口中运行

  • 上面虽然可以解决运行多个 websocket 实例,但是你会发现有几个文件,就会有几个运行窗口

  • 如果开启的服务更多,窗口也会更多,那么如何在同一个窗口中运行启动多个服务呢

  • 那么如果要解决这个问题,我们就可以创建一个 init.bat 文件,然后在文件中加入以下代码,然后双击运行即可实现在同一个窗口中启动多个服务

  • /d:表示切换目录

  • /b:表示不打开新窗口,在当前窗口继续执行

%切换到项目根目录%cd /d E:\xxxxxx
%启动第一个服务%start /b php start_http.php
%启动第二个服务%start /b php start_websocket.php
复制代码


发布于: 刚刚阅读数: 3
用户头像

极客飞兔

关注

希望我写的软件能给别人带来一份全职工作。 2023-03-02 加入

CSDN专家博主,领域之星 阿里天猫精灵首席测评官,专家博主 华为云云享专家 思否2022年度先锋榜单

评论

发布
暂无评论
window 系统下 workerman 在同一个运行窗口中开启多个 websocket 服务_经验分享_极客飞兔_InfoQ写作社区