Yii2结合Workerman的websocket示例详解
发布:smiling 来源: PHP粉丝网 添加日期:2021-10-29 09:53:03 浏览: 评论:0
这篇文章主要给大家介绍了关于Yii2结合Workerman的websocket的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
前言
本文主要给大家介绍了关于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 connection\n";
- };
- // 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 closed\n";
- };
- }
添加启动模块
- /**
- * workman websocket start
- */
- public function start()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'start';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- // Run worker
- Worker::runAll();
- }
添加停止模块
- /**
- * workman websocket stop
- */
- public function stop()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'stop';
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
添加重启模块
- /**
- * workman websocket restart
- */
- public function restart()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'restart';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
添加重载模块
- /**
- * workman websocket reload
- */
- public function reload()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'reload';
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
添加状态模块
- /**
- * workman websocket status
- */
- public function status()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'status';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- // Run worker
- Worker::runAll();
- }
添加链接数模块
- /**
- * workman websocket connections
- */
- public function connections()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'connections';
- // Run worker
- 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' => 'app\commands\WorkermanWebSocketController',
- '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 http://127.0.0.1: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
- durban none websocket://127.0.0.1:2346 4 [OK]
- ----------------------------------------------------------------
- Input "php workerman-web-socket stop" to stop. Start success.
7、其他
commands/WorkermanWebSocketController.php 完整代码如下
- <?php
- /**
- * WorkmanWebSocket 服务相关
- */
- namespace app\commands;
- use Workerman\Worker;
- use yii\console\Controller;
- use yii\helpers\Console;
- /**
- *
- * WorkermanWebSocket
- *
- * @author durban.zhang <durban.zhang@gmail.com>
- */
- class WorkermanWebSocketController extends Controller
- {
- 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->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 connection\n";
- };
- // Emitted when data received
- $wsWorker->onMessage = function ($connection, $data) {
- // Send hello $data
- $connection->send('dddd hello ' . $data);
- };
- // Emitted when connection closed
- $wsWorker->onClose = function ($connection) {
- echo "Connection closed\n";
- };
- }
- /**
- * workman websocket start
- */
- public function start()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'start';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- // Run worker
- Worker::runAll();
- }
- /**
- * workman websocket restart
- */
- public function restart()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'restart';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
- /**
- * workman websocket stop
- */
- public function stop()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'stop';
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
- /**
- * workman websocket reload
- */
- public function reload()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'reload';
- if ($this->gracefully) {
- $argv[2] = '-g';
- }
- // Run worker
- Worker::runAll();
- }
- /**
- * workman websocket status
- */
- public function status()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'status';
- if ($this->daemon) {
- $argv[2] = '-d';
- }
- // Run worker
- Worker::runAll();
- }
- /**
- * workman websocket connections
- */
- public function connections()
- {
- $this->initWorker();
- // 重置参数以匹配Worker
- global $argv;
- $argv[0] = $argv[1];
- $argv[1] = 'connections';
- // Run worker
- 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
- durban none websocket://127.0.0.1:2346 4 [OK]
- ----------------------------------------------------------------
- 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:\Workerman\Events\Swoole
- 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
Tags: Yii2 Workerman websocket
- 上一篇:让Laravel API永远返回JSON格式响应的方法示例
- 下一篇:最后一页
相关文章
- ·yii2超好用的日期组件和时间组件(2019-07-30)
- ·yii2的ActiveForm表单使用的方法介绍(2020-02-15)
- ·Yii2框架的csrf验证原理分析及token缓存解决方案(2020-04-05)
- ·Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源(2021-03-01)
- ·yii2.0之GridView自定义按钮和链接用法(2021-05-03)
- ·列举PHP的Yii 2框架的开发优势(2021-06-08)
- ·Yii2.0高级框架数据库增删改查的一些操作(2021-06-26)
- ·实例讲解yii2.0在php命令行中运行的步骤(2021-06-27)
- ·yii2.0使用Plupload实现带缩放功能的多图上传(2021-06-30)
- ·yii2.0实现验证用户名与邮箱功能(2021-06-30)
- ·yii2中添加验证码的实现方法(2021-07-05)
- ·YII2.0之Activeform表单组件用法实例(2021-07-05)
- ·yii2中使用Active Record模式的方法(2021-07-05)
- ·yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析(2021-07-05)
- ·Yii2框架引用bootstrap中日期插件yii2-date-picker的方法(2021-07-05)
- ·yii2中的rules 自定义验证规则详解(2021-07-29)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)