前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Yii2结合Workerman的websocket示例详解

Yii2结合Workerman的websocket示例详解

作者头像
子润先生
修改于 2021-07-13 03:38:03
修改于 2021-07-13 03:38:03
1K0
举报

前言

本文主要给大家介绍了关于Yii2结合Workerman的websocket的相关内容,两者都是好东西,我就想着能不能结合起来,这样Yii2出现瓶颈的时候有些业务就可以平滑地迁移到Workerman中。下面话不多说了,来随着小编来一起看看详细的介绍吧

步骤如下

1、安装workerman

composer require workerman/workerman

2、启动workerman

创建commands/WorkermanWebSocketController.php文件

创建actionIndex()函数,用来启动,代码如下

public function actionIndex()

{

if ('start' == $this->send) {

try {

$this->start($this->daemon);

} catch (Exception $e) {

$this->stderr($e->getMessage() . "n", Console::FG_RED);

}

} else if ('stop' == $this->send) {

$this->stop();

} else if ('restart' == $this->send) {

$this->restart();

} else if ('reload' == $this->send) {

$this->reload();

} else if ('status' == $this->send) {

$this->status();

} else if ('connections' == $this->send) {

$this->connections();

}

}

添加初始化模块

public function initWorker()

{

$ip = isset($this->config['ip']) ? $this->config['ip'] : $this->ip;

$port = isset($this->config['port']) ? $this->config['port'] : $this->port;

$wsWorker = new Worker("websocket://{$ip}:{$port}");

// 4 processes

$wsWorker->count = 4;

// Emitted when new connection come

$wsWorker->onConnect = function ($connection) {

echo "New connectionn";

};

// Emitted when data received

$wsWorker->onMessage = function ($connection, $data) {

// Send hello $data

$connection->send('hello ' . $data);

};

// Emitted when connection closed

$wsWorker->onClose = function ($connection) {

echo "Connection closedn";

};

}

添加启动模块

/**

public function start()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'start';

if ($this->daemon) {

$argv[2] = '-d';

}

// Run worke

Worker::runAll();

}

添加停止模块

/**

public function stop()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'stop';

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

添加重启模块

/**

public function restart()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'restart';

if ($this->daemon) {

$argv[2] = '-d';

}

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

添加重载模块

/**

public function reload()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'reload';

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

添加状态模块

/**

public function status()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'status';

if ($this->daemon) {

$argv[2] = '-d';

}

// Run worke

Worker::runAll();

}

添加链接数模块

/**

public function connections()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'connections';

// Run worke

Worker::runAll();

}

3、前端调用

<script>

// Create WebSocket connection.

const ws = new WebSocket('ws://{{ app.request.hostName }}:2347/'); // 这里是获取的网站的域名,测试的时候可以改为自己的本地的ip地址

// Connection opened

ws.addEventListener('open', function (event) {

ws.send('Hello Server!');

});

// Listen for messages

ws.addEventListener('message', function (event) {

console.log('Message from server ', event.data);

});

setTimeout(function() {

ws.send('ssssss');

}, 10000);

</script>

4、config参数配置

修改console.php并添加如下代码

'controllerMap' => [

'workerman-web-socket' => [

'class' => 'appcommandsWorkermanWebSocketController',

'config' => [

'ip' => '127.0.0.1',

'port' => '2346',

'daemonize' => true,

],

],

],

5、nginx配置

为什么会用 nginx, 我们正常部署上线是不可能直接使用ip的,这个户存在安全隐患,最好是绑定一个域名

server {

charset utf-8;

client_max_body_size 128M;

listen 2347;

server_name www.gowhich.com; # 这里改为自己的域名

access_log /xxx.workerman.access.log; # 换成自己服务器的nginx日志路径

error_log /xxx.workerman.error.log; # 换成自己服务器的nginx日志路径

location / {

proxy_pass

:2346; # 代理2346 也可以根据项目配置为自己的端口

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

}

}

重新nginx

nginx -s relad 或者 sudo nginx -s reload

然后将第3步的代码加入自己做的视图中,如果没有问题的话,websocket启动后就能正常通讯了。

6、启动workerman websocket

// 启动

./yii workerman-web-socket -s start -d

如果没有问题的话会得到类似如下的结果

$ ./yii workerman-web-socket -s start -d

Workerman[workerman-web-socket] start in DAEMON mode

----------------------- WORKERMAN -----------------------------

Workerman version:3.5.13 PHP version:7.1.16

------------------------ WORKERS -------------------------------

user worker listen processes status

Input "php workerman-web-socket stop" to stop. Start success.

7、其他

commands/WorkermanWebSocketController.php 完整代码如下

<?php

/**

namespace appcommands;

use WorkermanWorker;

use yiiconsoleController;

use yiihelpersConsole;

/**

*

class WorkermanWebSocketController extends Controlle

{

public $send;

public $daemon;

public $gracefully;

// 这里不需要设置,会读取配置文件中的配置

public $config = [];

private $ip = '127.0.0.1';

private $port = '2346';

public function options($actionID)

{

return ['send', 'daemon', 'gracefully'];

}

public function optionAliases()

{

return [

's' => 'send',

'd' => 'daemon',

'g' => 'gracefully',

];

}

public function actionIndex()

{

if ('start' == $this->send) {

try {

$this-&gt;start($this->daemon);

} catch (Exception $e) {

$this-&gt;stderr($e->getMessage() . "n", Console::FG_RED);

}

} else if ('stop' == $this->send) {

$this->stop();

} else if ('restart' == $this->send) {

$this->restart();

} else if ('reload' == $this->send) {

$this->reload();

} else if ('status' == $this->send) {

$this->status();

} else if ('connections' == $this->send) {

$this->connections();

}

}

public function initWorker()

{

$ip = isset($this->config['ip']) ? $this-&gt;config['ip'] : $this->ip;

$port = isset($this->config['port']) ? $this-&gt;config['port'] : $this->port;

$wsWorker = new Worker("websocket://{$ip}:{$port}");

// 4 processes

$wsWorker->count = 4;

// Emitted when new connection come

$wsWorker-&gt;onConnect = function ($connection) {

echo "New connectionn";

};

// Emitted when data received

$wsWorker-&gt;onMessage = function ($connection, $data) {

// Send hello $data

$connection-&gt;send('dddd hello ' . $data);

};

// Emitted when connection closed

$wsWorker-&gt;onClose = function ($connection) {

echo "Connection closedn";

};

}

/**

public function start()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'start';

if ($this->daemon) {

$argv[2] = '-d';

}

// Run worke

Worker::runAll();

}

/**

public function restart()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'restart';

if ($this->daemon) {

$argv[2] = '-d';

}

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

/**

public function stop()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'stop';

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

/**

public function reload()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'reload';

if ($this->gracefully) {

$argv[2] = '-g';

}

// Run worke

Worker::runAll();

}

/**

public function status()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'status';

if ($this->daemon) {

$argv[2] = '-d';

}

// Run worke

Worker::runAll();

}

/**

public function connections()

{

$this->initWorker();

// 重置参数以匹配Worke

global $argv;

$argv[0] = $argv[1];

$argv[1] = 'connections';

// Run worke

Worker::runAll();

}

}

workerman websocket支持的其他命令

重启

$ ./yii workerman-web-socket -s restart -d

Workerman[workerman-web-socket] restart

Workerman[workerman-web-socket] is stopping ...

Workerman[workerman-web-socket] stop success

----------------------- WORKERMAN ---/

/--------------------------

Workerman version:3.5.13 PHP version:7.1.16

------------------------ WORKERS -------------------------------

user worker listen processes status

Input "php workerman-web-socket stop" to stop. Start success.

重载

$ ./yii workerman-web-socket -s reload

Workerman[workerman-web-socket] reload

状态

$ ./yii workerman-web-socket -s status -g

Workerman[workerman-web-socket] status

----------------------------------------------GLOBAL STATUS----------------------------------------------------

Workerman version:3.5.13 PHP version:7.1.16

start time:2018-09-10 11:22:15 run 0 days 0 hours

load average: 1.79, 2, 2 event-loop:WorkermanEventsSwoole

1 workers 4 processes

worker_name exit_status exit_count

none 0 12

----------------------------------------------PROCESS STATUS---------------------------------------------------

pid memory listening worker_name connections send_fail timers total_request qps status

8283 4M websocket://127.0.0.1:2346 none 0 0 0 0 0 [idle]

8284 4M websocket://127.0.0.1:2346 none 0 0 0 0 0 [idle]

8285 4M websocket://127.0.0.1:2346 none 0 0/

/ 0 0 0 [idle]

8286 4M websocket://127.0.0.1:2346 none 0 0 0 0 0 [idle]

----------------------------------------------PROCESS STATUS---------------------------------------------------

Summary 16M - - 0 0 0 0 0 [Summary]

连接数

./yii workerman-web-socket -s connections

Workerman[workerman-web-socket] connections

--------------------------------------------------------------------- WORKERMAN CONNECTION STATUS --------------------------------------------------------------------------------

PID Worker CID Trans Protocol ipv4 ipv6 Recv-Q Send-Q Bytes-R Bytes-W Status Local Address Foreign Address

我这里暂时连接的,所以没有连接的信息

停止

$ ./yii workerman-web-socket -s stop

Workerman[workerman-web-socket] stop

Workerman[workerman-web-socket] is stopping ...

Workerman[workerman-web-socket] stop success

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

本文系转载,前往查看

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

本文系转载,前往查看

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenAI是什么
2015年由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得·蒂尔等硅谷科技大亨创立。 2016年6月21日,OpenAI宣布了其主要目标,包括制造“通用”机器人和使用自然语言的聊天机器人。OpenAI研发主管伊利娅·苏特斯科娃(Ilya Sutskever)、OpenAI CTO格雷格·布劳克曼(Greg Brockman)硅谷知名创业加速器Y Combinator总裁萨姆·阿尔特曼(Sam Altman)以及连续创业家埃隆·马斯克(Elon Musk)等人联合发表博文称:“我们正致力于利用物理机器人(现有而非OpenAI开发)完成基本家务。” 2019年7月22日,微软投资OpenAI 10亿美元,双方将携手合作替Azure云端平台服务开发人工智能技术。 2020年6月11日,OpenAI宣布了GPT-3语言模型,微软于2020年9月22日取得独家授权。 2022年6月,量子计算专家、ACM计算奖得主Scott Aaronson宣布,将加盟公司[2]。 2023年1月30日,微软宣布已与OpenAI扩大合作伙伴关系,声明称,作为两家公司合作伙伴关系的第三阶段,微软将向OpenAI进行一项为期多年、价值数十亿美元的投资,以加速其在人工智能(AI)领域的技术突破。
zhangjiqun
2024/12/13
2690
OpenAI是什么
深度剖析OpenAI的技术原理
OpenAI,作为人工智能领域的先锋,近年来在自然语言处理、图像生成、强化学习等多个方面取得了显著的研究成果。
小白的大数据之旅
2024/12/24
4730
一文读懂 OpenAI
OpenAI 是一家美国人工智能(AI)研究实验室,由非营利性 OpenAI Incorporated(OpenAI Inc.)及其营利性子公司 OpenAI Limited Partnership(OpenAI LP)组成。OpenAI 进行 AI 研究的目的是促进和开发友好的 AI。OpenAI 系统运行在世界上第五强大的超级计算机上。该组织于 2015 年由 Sam Altman、Reid Hoffman 在旧金山成立,杰西卡·利文斯顿(Jessica Livingston)、埃隆·马斯克(Elon Musk)、伊利亚·萨茨克维尔(Ilya Sutskever)、彼得·泰尔(Peter Thiel)等人共同认捐了 10 亿美元。马斯克于 2018 年辞去董事会职务,但仍是捐助者。微软在 2019 年向 OpenAI LP 提供了 10 亿美元的投资,并于 2023 年 1 月向其提供了第二笔多年期投资,据报道为 100 亿美元。
李维亮
2023/05/16
1.2K0
一文看尽SOTA生成式模型:9大类别21个模型全回顾!
来源:新智元 极市平台本文约3800字,建议阅读5分钟本文总结了2022年发布的21个生成式模型,一次看明白生成式模型的发展脉络! 过去的两年时间里,AI界的大型生成模型发布呈井喷之势,尤其是Stable Diffusion开源和ChatGPT开放接口后,更加激发了业界对生成式模型的热情。 但生成式模型种类繁多,发布速度也非常快,稍不留神就有可能错过了sota。 最近,来自西班牙科米利亚斯主教大学的研究人员全面回顾了各个领域内AI的最新进展,将生成式模型按照任务模态、领域分为了九大类,并总结了2022年发
数据派THU
2023/03/29
1.3K0
一文看尽SOTA生成式模型:9大类别21个模型全回顾!
人工智能|利用人工智能自动找bug
在程序员编程的过程中,产生Bug是一件稀松平常的事情,以前在编码的过程中提前找出Bug,需要通过单元测试、CodeReview等各种方式。
霍格沃兹测试开发Muller老师
2024/07/29
1730
前端同学都是如何玩转 ChatGPT 的???
我在去年的时候就跟风注册了一波,其回答问题的准确性和编码能力让我吃惊。不得不说,ChatGPT作为一个新兴的AI产品,和老美的电影里的人工智能有那么一些相像了,甩了三问一不知的小爱、小度和小E不止一条街。
@超人
2023/05/12
6290
前端同学都是如何玩转 ChatGPT 的???
用chatGPT写一个SAP的资产负债表
例如,您可以利用ChatGPT构建一个聊天机器人,用户可以通过聊天机器人与ChatGPT进行文本对话。ChatGPT可以根据用户输入的文本,自动生成合适的回复。
matinal
2023/10/13
2420
用chatGPT写一个SAP的资产负债表
独家 | 这张骑马的宇航员图片是AI感知世界的一个里程碑(附链接)
文:Will Douglas Heaven April 6, 2022(2022 年4月6日)翻译:陈超校对:zrx 本文约3400字,建议阅读10分钟本文介绍了DALL-E的升级版,DALL-E 2对于人工智能的意义。 DALL-E 2021年初OpenAI的制图神经网络DALL-E一经发布,该项目便以新方法整合不同概念的类人化能力得到瞩目。DALL-E根据需求制作的图片是超现实且卡通化的,他们展现出了AI已经学会了世界是如何融合在一起的关键课程。DALL-E的鳄梨手扶椅具有鳄梨和椅子的关键特征;穿着t
数据派THU
2022/04/27
1.8K0
独家 | 这张骑马的宇航员图片是AI感知世界的一个里程碑(附链接)
OpenAI首届AI春晚,创业公司屠杀夜!GPT-4炸裂更新,API跳楼价大甩卖
OpenAI的CEO Altman在分享了GPT-4的数十项新增功能和改进,并降低了平台许多服务的定价:
新智元
2023/11/08
3290
OpenAI首届AI春晚,创业公司屠杀夜!GPT-4炸裂更新,API跳楼价大甩卖
ChatGPT:人工智能进化的里程碑-小智AI
ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨OpenAI ChatGPT|GPT-4|GPT-3|人机对话|ChatGPT应用|小智ai|小智ai|小智ai|小智ai|小智AI|chatgpt小智A
用户10544499
2023/05/19
9220
ChatGPT:人工智能进化的里程碑-小智AI
一篇不枯燥的ChatGPT闲谈
导语|是的,这又是一篇ChatGPT有关的文章,虽然已经有很多篇讲ChatGPT的文章。不过,还是要写一下,毕竟过去的一个月发生了那么多新的故事。 文章总共有三部分:先科普一下ChatGPT中的GPT是什么,然后介绍从GPT3到ChatGPT的过程,最后进行一些个ChatGPT闲谈。如果不想看技术,可以直接跳到闲谈。 鉴于已经有非常多的优秀创作者进行总结和分析,本文将会包含非常多的论文原文以及资源链接,都是值得一阅的好文,再次感谢这些优秀的创作者们。 本文作者:shutianma,腾讯TEG用户研究 Cha
腾讯大讲堂
2023/04/06
1.1K0
一篇不枯燥的ChatGPT闲谈
聊一聊自然语言处理在人工智能领域中的应用
自然语言处理NLP属于AI的一个子领域,专注于让机器理解和生成人类语言,比如机器翻译、情感分析、智能助手这些常见的,但也要想到一些新兴的应用,比如法律文本分析或者教育辅助工具。
漫谈测试
2025/05/01
1680
聊一聊自然语言处理在人工智能领域中的应用
生成式人工智能如何改变创意工作
来源:Science AI本文约4400字,建议阅读10+分钟生成式AI模型有可能颠覆内容创作的世界。 企业的生成式 AI 模型有可能颠覆内容创作的世界,对营销、软件、设计、娱乐和人际交流产生重大影响。这些模型能够生成文本和图像:博客文章、程序代码、诗歌和艺术品。该软件使用复杂的机器学习模型,根据先前的单词序列预测下一个单词,或根据描述先前图像的单词预测下一张图像。公司需要了解这些工具的工作原理,以及它们如何增加价值。 大型语言和图像 AI 模型,有时称为生成 AI 或基础模型,为执行内容创建的企业和专业
数据派THU
2023/03/29
5570
生成式人工智能如何改变创意工作
一篇推文看一年!Jim Fan力荐2025必读清单:50篇论文,扫盲「全领域AI实战」
现行的AI从工程技术角度可以分为十个领域:前沿大模型、基准评估、提示思维链、检索增强生成、智能体、代码生成、视觉、声音、图像/视频扩散、微调,每个领域选出5篇代表作和相关工作,看完+实践=AI全栈大神!
新智元
2025/02/15
1430
一篇推文看一年!Jim Fan力荐2025必读清单:50篇论文,扫盲「全领域AI实战」
290亿美元!ChatGPT爆火,OpenAI七周年估值翻番
---- 新智元报道   编辑:David 【新智元导读】ChatGPT持续爆火,OpenAI也成为资本市场上最炙手可热的香饽饽,最新估值有望达到290亿美元,比2021年上次融资时翻了一番。 如果问哪家公司的AI实力最强,很多人都有自己的答案。但如果问最近一个多月最火的AI工具是什么,答案想必没什么争议。 ChatGPT。 随着ChatGPT的持续爆红,它背后的机构OpenAI看起来也要一夜暴富了。 据多家外媒报道,OpenAI正在与投资人磋商,打算出售现有价值3亿美元的股票。如果成功,这家公司估
新智元
2023/02/24
4690
290亿美元!ChatGPT爆火,OpenAI七周年估值翻番
不用1750亿!OpenAI CEO放话:GPT-4参数量不增反减
近日,OpenAI的首席执行官Sam Altman出席了「the AC10 online meetup」的线上QA,并透露了关于GPT-4的最新消息。
新智元
2021/10/12
1.2K0
微软ATP带你看| 爆火的ChatGPT是什么?
GPT(Generative Pre-trained Transformer)系列是由OpenAI提出的非常强大的预训练语言模型。
叶锦鲤
2023/03/21
7970
微软ATP带你看| 爆火的ChatGPT是什么?
OpenAI掌门人Sam Altman:AI的下一个发展阶段
来源|Greylock OneFlow社区编译 翻译|胡燕君、贾川 预告了一整年的GPT-4迟迟没来,人们猜想OpenAI是不是要跳票了,更何况他们之前的得意之作DALL-E也被开源Stable Diffusion打了个措手不及,再不来点深水炸弹业界地位危矣。 不过,就在大家以为今年OpenAI将以沉寂收场时,聊天机器人模型ChatGPT横空出世,让人们看到了AI的更大创造力,聚光灯也再度打到了OpenAI的身上。 今年9月,LinkedIn联合创始人ReidHoffman与OpenAI首席执行官Sam A
AI科技大本营
2023/04/06
3900
OpenAI掌门人Sam Altman:AI的下一个发展阶段
OpenAI超级对话模型ChatGPT发布!智能回答堪比雅思口语满分案例
对话格式使ChatGPT可以回答后续问题、承认错误、挑战不正确的前提并拒绝不适当的请求。
新智元
2023/01/08
1.3K0
OpenAI超级对话模型ChatGPT发布!智能回答堪比雅思口语满分案例
盘一盘可以给开发人员提效的人工智能/AI开发者工具
这是一个精选的人工智能开发者工具列表。这些工具利用人工智能来辅助开发人员完成代码补全、重构、调试、文档编写等任务。
山行AI
2023/09/08
7390
盘一盘可以给开发人员提效的人工智能/AI开发者工具
推荐阅读
相关推荐
OpenAI是什么
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档