加入收藏 | 设为首页 | 会员中心 | 我要投稿 承德站长网 (https://www.0314zz.com.cn/)- 云开发、边缘计算、数据分析、视频终端、人体识别!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

swoole使用案例

发布时间:2022-08-02 13:56:33 所属栏目:PHP教程 来源:互联网
导读:swoole使用 服务器及客户端 4种服务器【tcp/udp/web/websocket】 TCP服务器 //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server(127.0.0.1, 9501); //监听连接进入事件 $serv-on(connect, function ($serv, $fd) { echo Client: Connect.
  swoole使用
  服务器及客户端
  4种服务器【tcp/udp/web/websocket】
  TCP服务器
  //创建Server对象,监听 127.0.0.1:9501端口
  $serv = new swoole_server("127.0.0.1", 9501);
  //监听连接进入事件
  $serv->on('connect', function ($serv, $fd) {
      echo "Client: Connect.n";
  });
  //监听数据接收事件
  $serv->on('receive', function ($serv, $fd, $from_id, $data) {
      $serv->send($fd, "Server: ".$data);
  });
  //监听连接关闭事件
  $serv->on('close', function ($serv, $fd) {
      echo "Client: Close.n";
  });
  //启动服务器
  $serv->start();
  UDP服务器
  //创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP
  $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
  //监听数据接收事件
  $serv->on('Packet', function ($serv, $data, $clientInfo) {
      $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
      var_dump($clientInfo);
  });
  //启动服务器
  $serv->start();
  http服务器
  $http = new swoole_http_server("0.0.0.0", 9501);
  $http->on('request', function ($request, $response) {
      var_dump($request->get, $request->post);
      $response->header("Content-Type", "text/html; charset=utf-8");
      $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
  });
  $http->start();
  websocket服务器
  服务器端:
  //创建websocket服务器对象,监听0.0.0.0:9502端口
  $ws = new swoole_websocket_server(“0.0.0.0”, 9502);
 
  //监听WebSocket连接打开事件
  $ws->on('open', function ($ws, $request) {
      var_dump($request->fd, $request->get, $request->server);
      $ws->push($request->fd, "hello, welcomen");
  });
 
  //监听WebSocket消息事件
  $ws->on('message', function ($ws, $frame) {
      echo "Message: {$frame->data}n";
      $ws->push($frame->fd, "server: {$frame->data}");
  });
 
  //监听WebSocket连接关闭事件
  $ws->on('close', function ($ws, $fd) {
      echo "client-{$fd} is closedn";
  });
 
  $ws->start();
  客户端JS:
 
  var wsServer = 'ws://192.168.50.151:9502';
  var websocket = new WebSocket(wsServer);
  websocket.onopen = function (evt) {
      console.log("Connected to WebSocket server.");
  };
 
  websocket.onclose = function (evt) {
      console.log("Disconnected");
  };
 
  websocket.onmessage = function (evt) {
      console.log('Retrieved data from server: ' + evt.data);
  };
 
  websocket.onerror = function (evt, e) {
      console.log('Error occured: ' + evt.data);
  };
  辅助
  定时器
  //每隔2000ms触发一次
  swoole_timer_tick(2000, function ($timer_id) {
      echo "tick-2000msn";
  });
 
  //3000ms后执行此函数
  swoole_timer_after(3000, function () {
      echo "after 3000ms.n";
  });
  异步tcp服务器处理任务
  $serv = new swoole_server("127.0.0.1", 9501);
 
  //设置异步任务的工作进程数量
  $serv->set(array('task_worker_num' => 4));
 
  $serv->on('receive', function($serv, $fd, $from_id, $data) {
  //投递异步任务
      $task_id = $serv->task($data);
      echo "Dispath AsyncTask: id=$task_idn";
  });
 
  //处理异步任务
  $serv->on('task', function ($serv, $task_id, $from_id, $data) {
      echo "New AsyncTask[id=$task_id]".PHP_EOL;
      //返回任务执行的结果
      $serv->finish("$data -> OK");
  });
 
  //处理异步任务的结果
      $serv->on('finish', function ($serv, $task_id, $data) {
      echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
  });
 
  $serv->start();
  tcp同步客户端
  $client = new swoole_client(SWOOLE_SOCK_TCP);
 
  //连接到服务器
  if (!$client->connect('127.0.0.1', 9501, 0.5))
  {
  die("connect failed.");
  }
  //向服务器发送数据
  if (!$client->send("hello world"))
  {
  die("send failed.");
  }
  //从服务器接收数据
  $data = $client->recv();
  if (!$data)
  {
  die("recv failed.");
  }
  echo $data;
  //关闭连接
  $client->close();
  tcp异步客户端
  $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
 
  //注册连接成功回调
  $client->on("connect", function($cli) {
  $cli->send("hello worldn");
  });
 
  //注册数据接收回调
  $client->on("receive", function($cli, $data){
  echo "Received: ".$data."n";
  });
 
  //注册连接失败回调
  $client->on("error", function($cli){
  echo "Connect failedn";
  });
 
  //注册连接关闭回调
  $client->on("close", function($cli){
  echo "Connection closen";
  });
 
  //发起连接
  $client->connect('127.0.0.1', 9501, 0.5);
  自定义通讯协议设计
  进程/协程管理
  进程
  单独进程
  $process = new swoole_process('callback_function', true);
  $pid = $process->start();
  function callback_function(swoole_process $worker){
  $worker->exec('/usr/bin/php', array(__DIR__.'/write_file.php'));
  }// 启用本地的命令,加上绝对路径
  swoole_process::wait();
  【子进程】管道缓冲区读写及事件监听?
  $workers = [];
  $worker_num = 3;//创建的进程数
  for($i=0;$i<$worker_num; $i++){
  $process = new swoole_process('process');// 创建子进程 启动函数为 process
  $pid = $process->start();// 子进程启动
  $workers[$pid] = $process;// 存入字符数组
  }
  foreach($workers as $process){
  //子进程会包含此事件,加入到子进程中 异步IO
  swoole_event_add($process->pipe, function ($pipe) use($process){
  $data = $process->read();
  echo "RECV: " . $data.PHP_EOL;// 接收数据
  });//函数调用的神奇情况

(编辑:承德站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读