Swoole使用

2019-07-20  本文已影响0人  陈文瑜

swoole扩展安装

语法高亮

swoole_websocket使用

<?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();
var websocket = new WebSocket('ws://192.168.56.100:9501');
//发送数据
websocket.send('{"room_id":1}');
//接收数据
websocket.onmessage = function (event) {
  console.log(event)
}
//关闭
websocket.close();
上一篇下一篇

猜你喜欢

热点阅读