本文将给大家分享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篇所有内容,想要获取更多资讯或者教程欢迎关注编程学习网,每天获取新知识
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/7903/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料