swoole入门 使用 讲解 配合tp laravel使用

6 篇文章 0 订阅
5 篇文章 0 订阅

一、server(服务端)

那么什么是server呢 ? 顾名思义就是服务端。开发过程中平时接触比较多的无非就是 nginx 和 apache。作为 webServer(web服务器),二者都是通过监听某端口对外提供服务,然后进行服务的转发 进行   swoole 的 server 也不例外同样需要绑定端口,同时能够提供给客户端相关的服务。可以理解成   用了swoole server 可以不需要使用nginx 和apache 

web server工作流程(也就是我们常见的Nginx 和Apache)

Web Server(如Nginx)只是内容的分发者。举个例子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件。起到的就是那么个作用

比如当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程

同样SWOOLE能起到的就是Nginx的作用 把自身作为一个web服务器 用了SWOOLE可不用nginx作为转发服务器

创建一个server对象

创建 server 的步骤

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

示例

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

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

配置

在享受 swoole 的 server 之前 需要配置一下 server,比如调几个人来提供服务(几个进程),以及是否是后台执行(守护进程)等等一些其它的配置。  这个就需要我们做一些配置了,但是并非像 fpm 直接在文件内配置,我们可以在 server 创建后,通过 set 方法指定配置项。通过以下方法。附上swoole官方文档   一般开启了websocket 协议服务端   即可不用监听http协议服务端   因为 http基于TCP协议 websocket 

启动(服务端)

由于swoole_server只能运行在CLI模式下,所以不要试图通过浏览器进行访问,有听说过apache是基于nginx运行的吗,大家地位相同,只能配合,没有上下关系在命令行下面执行,自行去连接,这里不补充基础知识,php tese.php 就是刚刚创建的server的服务。同时因为swooleserver是常驻内存运行的,所以如果修改了代码,需要ctrl+c中断,重新运行才行

事件驱动

 调用方式基本都是如下  $server->onContent 等等上图的事件 这个是服务端监听的连接事件,当有一个客户端请求链接到swoole服务端 即可自动触发事件


//创建WebSocket Server对象,监听0.0.0.0:9502端口 创建一个服务
$server= new Swoole\WebSocket\Server('0.0.0.0', 9502);

//监听WebSocket连接打开事件
$server->on('Open', function ($ws, $request) {
    $ws->push($request->fd, "hello, welcome\n");
});


//服务端接收消息事件//监听WebSocket消息事件
$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
    //这里接收到服务端消息后echo到终端数据不进行返回
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; 
   //调用服务端的发送事件服务端再回复客户端的调用
    $server->push($frame->fd, "this is server");



$ws->start();

//onContent onStart  异步任务事件
$server->on('Task', function (Swoole\Server $server, Swoole\Server\Task $task) {
    var_dump($task);
    $task->finish([123, 'hello']); //完成任务,结束并返回数据
});



//$frame->fd	客户端的 socket id,使用 $server->push 推送数据时需要用到
//$frame->data	数据内容,可以是文本内容也可以是二进制数据,可以通过 opcode 的值来判断
//$frame->opcode	WebSocket 的 OPCode 类型,可以参考 WebSocket 协议标准文档
//$frame->finish	表示数据帧是否完整

    
});

二、同步client跟异步client

同步客户端

这里我们只讲同步客户端 SWOOLE4以后异步客户端只有协成客户端

这里我们用php讲解客户端 当然你也可以用http 写一个html来进行测试 (附上php连接和html连接方式)

方式一:通过php文件连接到swoole服务端 socket

$client = new Swoole\Client(SWOOLE_SOCK_TCP);//链接本地的9502端口
if (!$client->connect('127.0.0.1', 9502, -1)) {
    exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");//向服务端发送 hello world 参考上面创建的服务端
echo $client->recv(); //结果是 this is server 参考上面服务端 阻塞等待返回
$client->close();

方式二:前端new WebSocket('ws://127.0.0.1:9502') 连接 swoole服务端 socket

<!doctype html>
<html>
<head><title>测试WebSocket</title></head>
<body>
//对应上文9502 端口的swoole服务端
<script> var ws = new WebSocket('ws://127.0.0.1:9502');
	ws.onopen = function (event) {
		console.log('connected!');
		ws.send('hello server,this is client!');
	};
	ws.onmessage = function (event) { console.log(env); }//返回 this is server 9502端口
	ws.onclose = function (event) { console.log('closed!'); }; </script>
</body>
</html>

看了上文两种创建客户端的方式  可得出思路 tp laravel使用方法

TP和laravel也自带swoole

laravel是laravel-s  composer拉取下就行   注册一下服务提供者

tp手册直接composer下载

 

当然也可以通过 ajax发送http请求到对应php文件  也就是 上文第(二)同步client跟异步client 的文件   连接到swoole服务端   进行http的数据返回 但实际的内部通讯过程是socekt通讯等等 最后通过http返回 实际内部做了一个转发  这个功能可以是 监听websocket服务端状态 是否正常   

 前端再监听一下 ws.onmessage就可以实现socket通信了(此处没例子)此处只是演示了 可以通过普通的http请求通过php客户端去发送socket请求到自己搭建的服务端  

同步异步概念

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

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

  • 同步: 当一个同步调用发出去后,调用者要一直等待调用结果的通知后,才能进行后续的执行。
  • 异步:当一个异步调用发出去后,调用者不能立即得到调用结果的返回。

生活中的例子:

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

异步客户端

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

心跳检测

4.3被移除但是可能有其它的设备或者是语言是长连接,并且用来演示心跳检测

心跳是什么?

顾名思义,心跳是判断一个事物生还是死的一个标准,在swoole里,心跳是指用来判断一个连接是正常还是断开的

为什么需要心跳包?客户端如何维持心跳?

在从客户端到服务器的一条巨大的链路中会经过无数的路由器,其中每一个路由器都有可能会有检测到多少秒时间内无数据包则自动关闭连接的这种节能机制,为了让这个可能会出现的节能机制失效,客户端可以设置一个定时器,每隔固定的时间都发一个随机字符的一字节的数据包,通常我们把这种数据包就叫做心跳包。

为什么要心跳?

心跳的目的其实是通过判断客户端是否存活,从而回收fd(客户端id),系统为什么要回收fd,因为fd资源是有限的,所以必需重复利用 心跳作用主要有两个:

  1. 客户端定时给服务端发送点数据,防止连接由于长时间没有通讯而被某些节点的防火墙关闭导致连接断开的情况。
  2. 服务端可以通过心跳来判断客户端是否在线,如果客户端在规定时间内没有发来任何数据,就认为客户端下线。这样可以检测到客户端由于极端情况(断电、断网等)下线的事件。

心跳在swoole里的实现?

swoole会在主进程独立起一个心跳线程,通过定时轮询所有的连接,来判断连接的生死,所以swoole的心跳不会堵塞任何业务逻辑。

设置完成了之后,你会发现设置了定时检测之后,如果客户端没在规定的时间之内发送数据就会关闭。

  • heartbeat_check_interval: 服务器定时检测在线列表的时间
  • heartbeat_idle_time:       连接最大的空闲时间 (如果最后一个心跳包的时间与当前时间之差超过这个值,则认为该连接失效)

配置建议

建议 heartbeat_idle_time 为heartbeat_check_interval 的两倍多一点。 这个两倍是为了进行容错,允许丢一个包而多一点是考虑到网络的延时。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值