swoole 初识 简单的 Server Client

为了学 Swoole,我们在开始之前已经普及了很多的知识,这篇我们就要上手玩一把 Swoole,是不是感觉有点手痒了。。

前边几篇分别记录了:

都是一些简单的网路基础知识,不过这些最好要牢记。
然后就是 Swoole 扩展的安装:

Swoole server

创建

server 的创建其实非常简单,只需要我们在安装好扩展的基础上,实现以下代码就可以了。

1
2
// $serv = new swoole_server(string $host, int $port, int $mode = SWOOLE_PROCESS, int $sock_type = SWOOLE_SOCK_TCP);
$serv = new swoole_server('127.0.0.1', 9501);

swoole_server 类的构造函数一共有四个参数,上面我们填写了两个 ,还有两个有默认值,不填也可。
swoole_server构造函数

  • @param $host // 监听的 IP
  • @param $port // 监听的端口
  • @param int $mode // 运行模式,swoole提供了3种运行模式,默认为SWOOLE_PROCESS多进程模式
  • @param int $sock_type // Socket的类型,支持TCP、UDP、TCP6、UDP6、UnixSocket Stream/Dgram 6种,默认为SWOOLE_SOCK_TCP TCP 类型

设置

swoole_server->set()函数用于设置swoole_server运行时的各项参数。服务器启动后通过$serv->setting来访问set函数设置的参数数组。
具体有哪些设置,我们后边慢慢学习,现在我们先实现一个简单的例子。

1
2
3
$serv->set([
'worker_num' => 2,
]);

worker_num 设置启动的worker进程数量。swoole采用固定worker进程的模式。
PHP代码中是全异步非阻塞,worker_num配置为CPU核数的1-4倍即可。如果是同步阻塞,worker_num配置为100或者更高,具体要看每次请求处理的耗时和操作系统负载状况。

事件回调函数

swoole_server->on()注册Server的事件回调函数。

  • 第1个参数是回调的名称, 大小写不敏感,具体内容参考回调函数列表,事件名称字符串不要加on
  • 第2个函数是回调的PHP函数,可以是函数名的字符串,类静态方法,对象方法数组,匿名函数

有新的客户端连接时,worker进程内会触发该回调

1
2
3
$serv->on('Connect', function ($serv, $fd) {
echo "new client connected.\n";
});

server接收到客户端的数据后,worker进程内触发该回调

1
2
3
4
$serv->on('Receive', function ($serv, $fd, $fromId, $data) {
echo "Get Message From Client {$fd}:{$data}\n";
$serv->send($fd, $data);
});

客户端断开连接或者server主动关闭连接时 worker进程内调用

1
2
3
$serv->on('Close', function ($serv, $fd) {
echo "Client {$fd} close connection\n";
});

启动server

1
$serv->start();

Swoole Client

创建

client 的创建一样非常简单

1
$client = new swoole_client(SWOOLE_SOCK_TCP);

swoole_client 类的构造函数一共有三个参数。
swoole_client构造函数

  • @param int $sock_type 指定socket的类型,支持TCP/UDP、TCP6/UDP6 4种
  • @param int $sync_type SWOOLE_SOCK_SYNC/SWOOLE_SOCK_ASYNC 同步/异步
  • @param string $connectionKey 链接的编号,用于长连接复用

建立连接

1
$client->connect('127.0.0.1', 9501) || exit("connect failed. Error: {$client->errCode}\n");

发送数据

1
$client->send("hello server.");

从服务端接收数据

1
$response = $client->recv();

输出接受到的数据

1
echo $response . PHP_EOL;

关闭连接

1
$client->close();

Server 和 Client 通讯

终端执行命令,将 server 挂起

1
$ php server.php

打开新的终端执行 client 程序,在此之前你可以使用一下命令查看 server 监听的9501端口的监听情况

1
2
$ netstat -an | grep 9501
tcp4 0 0 127.0.0.1.9501 *.* LISTEN

从上边可以看到一些状态tcp4LISTEN等关键信息
执行 client 代码程序:

1
2
$ php client.php
hello server.

运行 server的终端会显示如下:

1
2
3
4
$ php server.php
new client connected.
Get Message From Client 1:hello server.
Client 1 close connection

到这个地方我们已经简单的实现了 Swoole Server 和 Client 的链接通讯。

坚持原创技术分享,您的支持将鼓励我继续创作!