Yii2结合Workerman的websocket示例详解
前言
本文主要给大家介绍了关于Yii2结合Workerman的websocket的相关内容,两者都是好东西,我就想着能不能结合起来,这样Yii2出现瓶颈的时候有些业务就可以平滑地迁移到Workerman中。下面话不多说了,来随着小编来一起看看详细的介绍吧
步骤如下
1、安装workerman
composerrequireworkerman/workerman
2、启动workerman
创建commands/WorkermanWebSocketController.php文件
创建actionIndex()函数,用来启动,代码如下
publicfunctionactionIndex() { if('start'==$this->send){ try{ $this->start($this->daemon); }catch(\Exception$e){ $this->stderr($e->getMessage()."\n",Console::FG_RED); } }elseif('stop'==$this->send){ $this->stop(); }elseif('restart'==$this->send){ $this->restart(); }elseif('reload'==$this->send){ $this->reload(); }elseif('status'==$this->send){ $this->status(); }elseif('connections'==$this->send){ $this->connections(); } }
添加初始化模块
publicfunctioninitWorker() { $ip=isset($this->config['ip'])?$this->config['ip']:$this->ip; $port=isset($this->config['port'])?$this->config['port']:$this->port; $wsWorker=newWorker("websocket://{$ip}:{$port}"); //4processes $wsWorker->count=4; //Emittedwhennewconnectioncome $wsWorker->onConnect=function($connection){ echo"Newconnection\n"; }; //Emittedwhendatareceived $wsWorker->onMessage=function($connection,$data){ //Sendhello$data $connection->send('hello'.$data); }; //Emittedwhenconnectionclosed $wsWorker->onClose=function($connection){ echo"Connectionclosed\n"; }; }
添加启动模块
/** *workmanwebsocketstart */ publicfunctionstart() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='start'; if($this->daemon){ $argv[2]='-d'; } //Runworker Worker::runAll(); }
添加停止模块
/** *workmanwebsocketstop */ publicfunctionstop() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='stop'; if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); }
添加重启模块
/** *workmanwebsocketrestart */ publicfunctionrestart() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='restart'; if($this->daemon){ $argv[2]='-d'; } if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); }
添加重载模块
/** *workmanwebsocketreload */ publicfunctionreload() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='reload'; if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); }
添加状态模块
/** *workmanwebsocketstatus */ publicfunctionstatus() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='status'; if($this->daemon){ $argv[2]='-d'; } //Runworker Worker::runAll(); }
添加链接数模块
/** *workmanwebsocketconnections */ publicfunctionconnections() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='connections'; //Runworker Worker::runAll(); }
3、前端调用
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{ charsetutf-8; client_max_body_size128M; listen2347; server_namewww.gowhich.com;#这里改为自己的域名 access_log/xxx.workerman.access.log;#换成自己服务器的nginx日志路径 error_log/xxx.workerman.error.log;#换成自己服务器的nginx日志路径 location/{ proxy_passhttp://127.0.0.1:2346;#代理2346也可以根据项目配置为自己的端口 proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerHost$host; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_http_version1.1; proxy_set_headerUpgrade$http_upgrade; proxy_set_headerConnection"upgrade"; } }
重新nginx
nginx-srelad或者sudonginx-sreload
然后将第3步的代码加入自己做的视图中,如果没有问题的话,websocket启动后就能正常通讯了。
6、启动workermanwebsocket
//启动 ./yiiworkerman-web-socket-sstart-d
如果没有问题的话会得到类似如下的结果
$./yiiworkerman-web-socket-sstart-d Workerman[workerman-web-socket]startinDAEMONmode -----------------------WORKERMAN----------------------------- Workermanversion:3.5.13PHPversion:7.1.16 ------------------------WORKERS------------------------------- userworkerlistenprocessesstatus durbannonewebsocket://127.0.0.1:23464[OK] ---------------------------------------------------------------- Input"phpworkerman-web-socketstop"tostop.Startsuccess.
7、其他
commands/WorkermanWebSocketController.php完整代码如下
*/ classWorkermanWebSocketControllerextendsController { public$send; public$daemon; public$gracefully; //这里不需要设置,会读取配置文件中的配置 public$config=[]; private$ip='127.0.0.1'; private$port='2346'; publicfunctionoptions($actionID) { return['send','daemon','gracefully']; } publicfunctionoptionAliases() { return[ 's'=>'send', 'd'=>'daemon', 'g'=>'gracefully', ]; } publicfunctionactionIndex() { if('start'==$this->send){ try{ $this->start($this->daemon); }catch(\Exception$e){ $this->stderr($e->getMessage()."\n",Console::FG_RED); } }elseif('stop'==$this->send){ $this->stop(); }elseif('restart'==$this->send){ $this->restart(); }elseif('reload'==$this->send){ $this->reload(); }elseif('status'==$this->send){ $this->status(); }elseif('connections'==$this->send){ $this->connections(); } } publicfunctioninitWorker() { $ip=isset($this->config['ip'])?$this->config['ip']:$this->ip; $port=isset($this->config['port'])?$this->config['port']:$this->port; $wsWorker=newWorker("websocket://{$ip}:{$port}"); //4processes $wsWorker->count=4; //Emittedwhennewconnectioncome $wsWorker->onConnect=function($connection){ echo"Newconnection\n"; }; //Emittedwhendatareceived $wsWorker->onMessage=function($connection,$data){ //Sendhello$data $connection->send('ddddhello'.$data); }; //Emittedwhenconnectionclosed $wsWorker->onClose=function($connection){ echo"Connectionclosed\n"; }; } /** *workmanwebsocketstart */ publicfunctionstart() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='start'; if($this->daemon){ $argv[2]='-d'; } //Runworker Worker::runAll(); } /** *workmanwebsocketrestart */ publicfunctionrestart() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='restart'; if($this->daemon){ $argv[2]='-d'; } if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); } /** *workmanwebsocketstop */ publicfunctionstop() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='stop'; if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); } /** *workmanwebsocketreload */ publicfunctionreload() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='reload'; if($this->gracefully){ $argv[2]='-g'; } //Runworker Worker::runAll(); } /** *workmanwebsocketstatus */ publicfunctionstatus() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='status'; if($this->daemon){ $argv[2]='-d'; } //Runworker Worker::runAll(); } /** *workmanwebsocketconnections */ publicfunctionconnections() { $this->initWorker(); //重置参数以匹配Worker global$argv; $argv[0]=$argv[1]; $argv[1]='connections'; //Runworker Worker::runAll(); } }
workermanwebsocket支持的其他命令
重启
$./yiiworkerman-web-socket-srestart-d Workerman[workerman-web-socket]restart Workerman[workerman-web-socket]isstopping... Workerman[workerman-web-socket]stopsuccess -----------------------WORKERMAN----------------------------- Workermanversion:3.5.13PHPversion:7.1.16 ------------------------WORKERS------------------------------- userworkerlistenprocessesstatus durbannonewebsocket://127.0.0.1:23464[OK] ---------------------------------------------------------------- Input"phpworkerman-web-socketstop"tostop.Startsuccess.
重载
$./yiiworkerman-web-socket-sreload Workerman[workerman-web-socket]reload
状态
$./yiiworkerman-web-socket-sstatus-g Workerman[workerman-web-socket]status ----------------------------------------------GLOBALSTATUS---------------------------------------------------- Workermanversion:3.5.13PHPversion:7.1.16 starttime:2018-09-1011:22:15run0days0hours loadaverage:1.79,2,2event-loop:\Workerman\Events\Swoole 1workers4processes worker_nameexit_statusexit_count none012 ----------------------------------------------PROCESSSTATUS--------------------------------------------------- pidmemorylisteningworker_nameconnectionssend_failtimerstotal_requestqpsstatus 82834Mwebsocket://127.0.0.1:2346none00000[idle] 82844Mwebsocket://127.0.0.1:2346none00000[idle] 82854Mwebsocket://127.0.0.1:2346none00000[idle] 82864Mwebsocket://127.0.0.1:2346none00000[idle] ----------------------------------------------PROCESSSTATUS--------------------------------------------------- Summary16M--00000[Summary]
连接数
./yiiworkerman-web-socket-sconnections Workerman[workerman-web-socket]connections ---------------------------------------------------------------------WORKERMANCONNECTIONSTATUS-------------------------------------------------------------------------------- PIDWorkerCIDTransProtocolipv4ipv6Recv-QSend-QBytes-RBytes-WStatusLocalAddressForeignAddress
我这里暂时连接的,所以没有连接的信息
停止
$./yiiworkerman-web-socket-sstop Workerman[workerman-web-socket]stop Workerman[workerman-web-socket]isstopping... Workerman[workerman-web-socket]stopsuccess
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。