什么是 Swoole?

Swoole 是一个高性能的网络通信引擎,提供了多种的网络通信协议。例如 UDP、TCP、Http 和 WebSocket 等各种通信协议。可以使完全同步的代码实现异步执行程序,例如异步 Redis、异步 MySQL、协程 Http 等异步 IO 操作。

如何安装 Swoole

Swoole 作为 PHP 的一个扩展库,在使用的过程中也和其他的函数库并无什么使用上的差别,但这个库又不是一个普通的库。这个库分为服务端和客户端,首先我们需要去通过内置的函数启动服务,然后在去请求服务。
安装的步骤也很简单,和其他的 PHP 函数库操作并差别,直接可以参考安装步骤 ,按照教程安装完成之后,我们就可以正常使用啦!

第一个 Demo

该 demo 是一个 TCP 服务的简单示例。 1.服务端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
// 1.创建一个swoole对象
/**
* swoole_server(主机地址,端口号);
*/
$swoole = new swoole_server('127.0.0.1', 9502);

// 设置连接参数
$swoole->set([
'reactor_num' => 2, // 线程数(全异步非阻塞服务器 worker_num配置为CPU核数的1-4倍即可)
'worker_num' => 2, // 工作进程数,该配置小于reactor_num配置时,swoole自动降低reactor_num的配置数
'max_conn' => 2, // 最大连接数(当前演示版本最低为36)
'max_request' => 100, // 最大请求数,表示在worker进程处理完n个请求之后,manager进程重新创建一个worker进程来处理请求,避免造成内存溢出情况.
'log_file' => '/usr/local/var/www/swoole/log/log.log',// 错误日志文件
'heartbeat_check_interval' => 30, // 轮询所有TCP连接,将超过心跳时间的连接关闭掉
'heartbeat_idle_time' => 30 // 心跳时间检测,如果tcp连接超过该时间之后,会自动关闭连接
]);

// 2.监听连接事件
/**
* on(event_name,function(swoole对象,客户端标识){});
*/
$swoole->on('connect', function ($swoole, $fd) {
echo '客户端' . $fd . '在' . date('Y-m-d H:i:s') . '连接成功';
});

// 3.监听接收数据事件
/**
*on(event_name,function(swoole对象,客户端标识,线程数,客户端数据){});
*/
$swoole->on('receive', function ($swoole, $fd, $reactor_id, $data) {
$swoole->send($fd, '用户发送的数据为' . $data . '客户端标志为' . $fd . '来源form_id为' . $reactor_id);
});

// 4.监听链接关闭事件
/**
* on(event_name,function(swoole对象,客户端标识){});
*/
$swoole->on('close', function ($swoole, $fd) {
echo '客户端' . $fd . '在' . date('Y-m-d H:i:s') . 'close-success';
});

// 5.启动服务
$swoole->start();

2.客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/**
* Created Author: 编程浪子走四方
* Author: 编程浪子走四方
* System: Mac Pro
* System User: apple
* Date: 2019-07-12
* Time: 11:15
*/
// 1.创建客户端连接对象并且连接为tcp连接
$ser = new swoole_client(SWOOLE_SOCK_TCP);

// 2.创建swoole连接
$ser->connect('127.0.0.1', 9502);

// 3.客户端输入数据并接收
fwrite(STDOUT, '请输入内容:');
$content = fwrite(STDOUT, fgets(STDIN));

// 4.将数据发送到swoole服务(可以将服务端的代码中的3相互对应参考)
$ser->send($content);

// 5.接受swoole服务返回的数据
$result = $ser->recv();

echo $result;

// 6.关闭连接
$ser->close();

如何操作第一个 Demo

1.启动我们的 Swoole,服务端的代码是 PHP 文件编写,所以我们用 cli 模式来启动服务(在 Swoole 中绝大部分的操作都是 cli 模式)

1
php index.php


这样 Swoole 服务就启动了。接下来,查看我们设置的 9502 端口是否被开启,来验证我们的服务是否真正的被打开了。

1
ps -anp | grep 9502


接下来,我们测试一个客户端向服务器端发送数据.执行客户端代码,这个案例需要结合上面的服务端和客户端的代码便知晓.

1
php index.php


除了使用 PHP 代码当客户端使用外,TCP 协议还支持 telnet 连接,下面使用 telnet 测试连接.

1
telnet 127.0.0. 9502

如果出现下面的结果,则表示能够正常连接,同时我们也可以输入任意内容,服务端接收到数据之后就会输出到终端.

测试多个连接.在 Swoole 中,可以开启一个服务多个客户端,因此我们只需要启动一个 Swoole 服务,创建多个 telnet 连接也是可行的.我们打开多个窗口去使用 telnet 连接服务端,此时会看到服务端终端输出如下信息.



PHP      原创 swoole

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!