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