编程学习网 > PHP技术 > Swoole教程分享之Server篇
2021
05-29

Swoole教程分享之Server篇

本文将给大家分享swoole教程之 server的讲解

server 的定义:


服务端,我们平时工作学习中接触比较多的就是 nginx 和 apache 作为 webServer,二者都是通过监听某个端口对外提供服务, swoole 的 server 也不例外,同样需要绑定端口,才可以提供给客户端相关服务;

创建 server


创建 server 的步骤:


1. 实例化 server 对象


2. 设置运行参数


3. 注册事件回掉参数


4. 启动服务器

示例代码:



<?php

// 创建服务端 server 对象  默认使用 tcp 协议

$server = new Swoole\Server('127.0.0.1', '9501');

$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;

   // 会发送到 客户端 的 recv 方法

   $server->send($fd, '我是服务端');

});

// 关闭事件

$server->on('close', function () {

   echo '新的连接关闭!' . PHP_EOL;

});

// 服务器开启状态

$server->start();


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



// 创建 server 对象,监听 0.0.0.0 :9800 端口

$server = new Swoole\Server('0.0.0.0', 9800);


监听端口时,使用 netstat 命令来检测端口是否被占用,如果端口已经被占用,会报一下错误



PHP Fatal error:  Uncaught Swoole\Exception: failed to listen server port[127.0.0.1:22], Error: Address already in use[98] in /data/wwwroot/default/swoole/01/server.php:5


server 简单配置


在使用 swoole 的 server 之前,同样要对 server 的运行进行配置,比如:配置几个进程数量,是否在后台运行「守护进程」等等。


但是 swoole 的配置参数,不想 fpm 的配置可以直接在 文件中配置。swoole 的 server 可以在创建后,通过 set 方法进行配置。


配置 worker 进程数量, 因为 swoole 时多进程的异步服务器所有需要设置工作进程数量,提升服务器性能;



$server->set(

   ['worker_num' => 2]

);


我们可以指定配置项 worker_num 等于某个正整数,默认为机器 CPU 的核数,官方建议该数值配置为。CPU 核数的 1-4 倍。


进程数并不是开启的越多越好,因为开的进程越多,内存的占用也就更多,进程间的切换也就需要耗费更多的资源;


事件驱动


swoole 另一个 吸引人的地方,就是 swoole_server 是事件驱动的,在使用过程中,不需要关注底层时怎么实现的,底层是 C 语言写的, PHP 只是做了传递的作用,所以只需要对底层相应的动作注册相应的回调即可。


示例:



// 监听消息事件

$server->on('connect', function ($server, $fd) {

   echo '新的连接进入:' . $fd . PHP_EOL;

});


参数 $server 是我们创建的 swoole_server 对象;


参数 $fd 是客户端的唯一标示,用于区分不同的客户端,同时该参数,是 1-1600万之间可以复用的整数;


简单解释复用:假设现在客户端 1,2,3,处于连接状态,客户端 4 要连接的话 $fd 就是 4 ,但是不巧的是客户端 3 连接不稳定,断掉了,客户端 4 连接 server 时, $fd 就是 3。


fd 会不断的发生变化,同一个客户端连接,可能使用不同的 fd ,所有只使用 fd 判断是哪一个客户端是不准确的;



// 监听消息事件

$server->on('receive', function (swoole_server $server, int $fd, int $from_id, string $data) {

   echo '新的消息进来了,连接标示为:' . $fd . PHP_EOL;

   // 会发送到 客户端 的 recv 方法

   $server->send($fd, '我是服务端');

});


参数 $from_id 指的是哪一个 reactor 线程;


参数 $data 这个参数就是服务端接受的数据,该数据是字符串或者二进制内容,注意在 receive 回调内,调用了 $server 的 send 方法,我们可以使用 send 方法向 client 发起通知;


示例:



// 关闭事件

$server->on('close', function () {

   echo '新的连接关闭!' . PHP_EOL;

});


监听客户端关闭,触发回调



// 服务器开启状态

$server->start();


启动服务器

以上就是分享Server篇所有内容,想要获取更多资讯或者教程欢迎关注编程学习网,每天获取新知识

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取