什么是Swoole?
Swoole是一个高性能的网络通信引擎,提供了多种的网络通信协议。例如UDP、TCP、Http和WebSocket等各种通信协议。可以使完全同步的代码实现异步执行程序,例如异步Redis、异步MySQL、协程Http等异步IO操作。
如何安装Swoole
Swoole作为PHP的一个扩展库,在使用的过程中也和其他的函数库并无什么使用上的差别,但这个库又不是一个普通的库。这个库分为服务端和客户端,首先我们需要去通过内置的函数启动服务,然后在去请求服务。 安装的步骤也很简单,和其他的PHP函数库操作并差别,直接可以参考安装步骤 ,按照教程安装完成之后,我们就可以正常使用啦!PHP安装Swoole扩展
第一个Demo
该demo是一个TCP服务的简单示例。 1.服务端代码
代码语言:javascript复制<?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.客户端代码
代码语言:javascript复制<?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模式)
代码语言:javascript复制php index.php
这样Swoole服务就启动了。接下来,查看我们设置的9502端口是否被开启,来验证我们的服务是否真正的被打开了。
代码语言:javascript复制ps -anp | grep 9502
接下来,我们测试一个客户端向服务器端发送数据.执行客户端代码,这个案例需要结合上面的服务端和客户端的代码便知晓.
代码语言:javascript复制php index.php
除了使用PHP代码当客户端使用外,TCP协议还支持telnet连接,下面使用telnet测试连接.
代码语言:javascript复制telnet 127.0.0. 9502
如果出现下面的结果,则表示能够正常连接,同时我们也可以输入任意内容,服务端接收到数据之后就会输出到终端.
测试多个连接.在Swoole中,可以开启一个服务多个客户端,因此我们只需要启动一个Swoole服务,创建多个telnet连接也是可行的.我们打开多个窗口去使用telnet连接服务端,此时会看到服务端终端输出如下信息.