美文网首页
Swoole使用

Swoole使用

作者: 陈文瑜 | 来源:发表于2019-07-20 16:35 被阅读0次

    swoole扩展安装

    • 下载地址
    • 安装步骤
      yum install -y unzip zip
      yum install gcc
      # 下载src
      unzip swoole-src-1.x-lts.zip
      phpize
      ./configure
      make && make install
      vim /etc/php.ini
      extension=/usr/lib64/php/modules/swoole.so
      

    语法高亮

    swoole_websocket使用

    • 服务器端编码swoole_websocket.php
    <?php
    ini_set('default_socket_timeout', -1);
    define('WORKER_NUM', 2);
    // define('WORKER_NUM', 8);
    define('DISPATCH_MODE', 2);
    define('DAEMONIZE', 0);
    
    class WebsocketTest {
    
      private $server;
      private $redis;
      public function __construct() {
    
          $this->server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
    
          $this->server->set(
              [
                  //开启woker进程数
                  'worker_num'    => WORKER_NUM,
                  //请求分发策略,
                  'dispatch_mode' => DISPATCH_MODE,
                  //是否守护进程
                  'daemonize'     => DAEMONIZE,
              ]
          );
          $this->server->on('open', [$this,"onOpen"]);
          $this->server->on('message',[$this,"onMessage"]);
          $this->server->on('close', [$this,"onClose"]);
    
          $this->server->on('request', function ($request, $response) {
              // 接收http请求从get获取message参数的值,给用户推送
              // $this->server->connections 遍历所有websocket连接用户的fd,给所有用户推送
              foreach ($this->server->connections as $fd) {
                  $this->server->push($fd, $request->get['message']);
              }
          });
    
          $this->server->on('WorkerStart', [$this,'onWorkerStart']);
    
          $this->server->start();
      }
    
      /**
       *@回调函数风格
       *onOpen onWorkerStart
       * @param swoole_websocket_server $server
       * @param $request
       */
      public function onOpen(swoole_websocket_server $server, $request) {
          echo "server: handshake success with fd{$request->fd}\n";
      }
    
      public function onClose($ser, $fd) {
          echo "client {$fd} closed\n";
      }
    
      public function onMessage(Swoole\WebSocket\Server $server, $frame) {
           $result =["fd"=>$frame->fd,"message"=>"from websocket_server!"];
           $result_encode = json_encode($result);
           echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
           $server->push($frame->fd,$result_encode);
      }
    
    
      public function onWorkerStart($serv, $worker_id){
          $this ->redis = new Redis();
          $this->redis->connect('127.0.0.1', 6379);
          $this->redis->auth('root');
    
          if($serv->worker_id == 0){
              echo "workerstart ..............".$serv->worker_id;
          }else{
              echo "workerstart ..............".$serv->worker_id;
              // $this->server->tick(5000, [$this, 'onTick']);
          }
      }
    
      public function onTick(){
          foreach ($this->server->connections as $connection) {
              $msg = $connection;
              $this->server->push($connection, json_encode($msg));
          }
      }
    }
    new WebsocketTest();
    
    • js端连接实例
    var websocket = new WebSocket('ws://192.168.56.100:9501');
    //发送数据
    websocket.send('{"room_id":1}');
    //接收数据
    websocket.onmessage = function (event) {
      console.log(event)
    }
    //关闭
    websocket.close();
    

    相关文章

      网友评论

          本文标题:Swoole使用

          本文链接:https://www.haomeiwen.com/subject/xusulctx.html