Yii2结合Workerman的websocket示例详解

4 篇文章 0 订阅

1、安装workerman

composer require workerman/workerman

2、启动workerman

./yii workerman-web-socket -s restart -d
./yii workerman-web-socket -s reload 
./yii workerman-web-socket -s status -g
./yii workerman-web-socket -s connections
./yii workerman-web-socket -s stop 
<?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支持的其他命令

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值