编程学习网 > PHP技术 > swoole > swoole网络编程--Server篇
2020
04-20

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[98in /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();

启动服务器


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

Python编程学习

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