• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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

    总结

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

    您可能感兴趣的文章:
    • Javascript Web Worker使用过程解析
    • JavaScript中的Web worker多线程API研究
    • 深入理解Node.js中的Worker线程
    • JavaScript中sharedWorker 实现多页面通信的实例详解
    • nodejs中使用worker_threads来创建新的线程的方法
    • Javascript Worker子线程代码实例
    • 理解JavaScript中worker事件api
    • 如何使用JS中的webWorker
    上一篇:PHP按符号截取字符串的指定部分的实现方法
    下一篇:php使用QueryList轻松采集js动态渲染页面方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    Yii2结合Workerman的websocket示例详解 Yii2,结合,Workerman,的,websocket,