swoole:server跟client

一、server

server,顾名思义,就是服务端。我们平时接触比较多的无非就是nginx和apache。作为webServer,二者都是通过监听某端口对外提供服务,swoole的server也不例外同样需要绑定端口,同时能够提供给客户端相关的服务。

1.创建一个server对象

创建server的步骤:

       1、实例化Server对象
       2、设置运行时参数
       3、注册事件回调函数
       4、启动服务器

示例:

//tcp协议$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象$server->set([
     'worker_num'=>2, //设置进程]);//监听事件,连接事件$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
    echo "消息发送过来:".$fd.PHP_EOL;
    $server->send($fd,'我是服务端');});//消息关闭$server->on('close',function (){
    echo "消息关闭".PHP_EOL;});//服务器开启$server->start();

server的创建,只需要绑定要监听的ip和端口,如果ip指定为127.0.0.1,则表示客户端只能位于本机才能连接,其他计算机无法连接,如果需要所有的客户端都能连接则可以设置0.0.0.0

$server=new Swoole\Server("0.0.0.0",9800);   //创建server对象

端口这里指定为9800,可以通过netstat查看下该端口是否被占用。如果该端口被占用,可更改为其他端口,如9502,9503等

2.配置:

在享受swoole的server之前,同样我们需要配置一下server,比如调几个人来提供服务(几个进程),以及是否是后台执行(守护进程)等等一些其它的配置。
这个就需要我们做一些配置了,但是并非像fpm直接在文件内配置,我们可以在server创建后,通过set方法指定配置项。
同时,这个配置项也有很多,比如说我们可以指定日志文件记录具体的错误信息等等,你都可以在官网的手册上寻找有哪些配置项,我们也会在贯穿swoole的同时讲解一部分常用的配置项。
这里我们首要说明一下worker进程数的配置,因为swoole是多进程的异步服务器所以需要设置工作进程数,提升服务器性能。

$server->set([
     'worker_num'=>2, //设置进程]);

我们可以指定配置项worker_num等于某个正整数。这个正整数设置多少合适,即我要开多少个worker进程处理们的业务逻辑才好呢我?官方建议我们设置为CPU核数的1-4倍。因为我们开的进程越多,内存的占用也就更多,进程间切换也就需要耗费更多的资源。我们这里设置开启两个worker进程。默认该参数的值等于你机器的CPU核数。

3.事件驱动

swoole另外一个比较吸引人的地方,就是swoole_server是事件驱动的。我们在使用的过程中不需要关注底层是怎么实现的,底层是C写的php只是做了个传递的作用,所以只需要对底层相应的动作注册相应的回调,在回调函数中处理业务逻辑即可。
什么意思呢?我举个例子:
你启动了一个server,当客户端连接的时候(触发事件),你不需要关心它是怎么连接的,你就单纯的注册一个connect函数,做一些连接后的业务处理即可(执行业务)。类似于js的事件监听,比如触发了click事件,就会执行相应的闭包。

图片2.png

//监听事件,连接事件$server->on('connect',function ($server,$fd){
    echo "新的连接进入:{$fd}".PHP_EOL;});

二、同步client跟异步client

默认的swoole的server是可以提供tcp/udp  socket请求协议,然后根据请求数据,执行相应的逻辑
在PHP中,我们常用socket函数来创建TCP连接,用CURL库来创建Http连接。同样的,为了简化操作,Swoole也提供了同样的Client类用于实现客户端的功能,并且增加了异步非阻塞的模式,让用户在客户端也能使用事件循环。

swoole_client的构造函数如下所示:

swoole_client->__construct($sock_type,SWOOLE_SOCK_SYNC, $key);

第一个参数:
SWOOLE_SOCK_TCP 创建tcp socket
SWOOLE_SOCK_TCP6 创建tcp ipv6 socket
SWOOLE_SOCK_UDP 创建udp socket
SWOOLE_SOCK_UDP6 创建udp ipv6 socket

第二个参数表示是同步还是异步
SWOOLE_SOCK_SYNC 同步客户端
SWOOLE_SOCK_ASYNC 异步客户端

第三个参数(暂不了解)
用于长连接的Key,默认使用IP:PORT作为key。相同key的连接会被复用

什么是网络协议?

网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合

TCP和UDP介绍

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到    达;UDP尽最大努力交付,即不保证可靠交付
3、tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4、TCP对系统资源要求较多,UDP对系统资源要求较少。


图片3.png

新建一个同步客户端

 //实例化客户端
 $client=new swoole\Client(SWOOLE_SOCK_TCP,SWOOLE_SYNC);
 //创建连接
 $client->connect('192.166.2.133',9800) || exit("连接失败");
  //(fd+id)识别身份
 //发数据
 $client->send("我是客户端");
 //接收消息
 echo $client->recv(); 
 //关闭
 $client->close();

同步client是同步阻塞的。一整套connect->send()->rev()->close()是同步进行的。如果需要大量的数据处理,后台不能在规定的时间内返回数据会导致接收超时,并且因为是同步执行所以需要等待后台数据的返回。

同步异步概念

swoole是既支持全异步,也支持同步,同步跟异步的概念,我们需要了解

同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。

同步: 当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。

异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。

生活中的例子:
同步买奶茶:小明点单交钱,然后等着拿奶茶;
异步买奶茶:小明点单交钱,店员给小明一个小票,等小明奶茶做好了,再来取。

异步客户端

当设定swoole_client为异步模式后,swoole_client就不能使用recv方法了,而需要通过on方法提供指定的回调函数,然后在回调函数当中处理,也就是小明等待奶茶做好了异步通知,消息发送跟接收并不是同步运行的。