Swoole快速入门

swoole介绍

  1. 是php的异步.并行.高性能网络通信引擎,提供php异步多线程服务器
  2. 异步TCP/UDP网络客户端 异步mysql 异步redis数据库连接池 异步文件读写 异步DNS查询
  3. 内置http/websocket服务器端/客户端

swoole功能库

  1. http服务 编写简单的web server,tcp/udp服务 编写消息接收处理系统
  2. 可以异步的处理请求 可以并发的处理同一个业务逻辑
  3. 协程相比线程更稳定和好用 socket通讯技术
  4. 毫秒级别定时器 可以在php中使用定时器

TCP和UDP的区别:

  1. TCP面向连接比如打电话要先拨号建立连接;UDP是无连接的,发送数据之前不需要建立连接
  2. TCP提供可靠的服务 通过TCP连接传送的数据 无差错 不丢失 不重复 按序到达 UDP尽最大努力交付,不保证可靠交付
  3. TCP通过校验和 重传控制 序号标识 滑动窗口 确认应答实现可靠传输 如丢包是的重发控制 可以对次序乱掉的分包进行顺序控制
  4. UDP具有较好的实时性 效率比较高 适用于对告诉传输和实时性有较高的通信或广播通信
  5. TCP对系统资源要求较多 UDP对系统资源要求较少 

在linux服务器上的安装(以centos7为例)

首先服务器的环境必须要有php 我是直接搭了一个lnmp的环境

(搭建过程:https://blog.csdn.net/zhangzeshan/article/details/96429085 )

先定位到

/usr/local/src

然后下载压缩包

wget https://pecl.php.net/get/swoole-4.2.0.tgz

解压

tar -zxf swoole-4.2.0.tgz

进入解压后的文件夹

cd swoole-4.2.0

安装依赖

yum -y install gcc gcc-c++  autoconf pcre-devel make

编译

phpize
./configure --with-php-config=PATH  (PATH指php-config的具体路径)
make && make install

这边的PATH的路径获取  可以通过 find / -name php-config  就可以找到具体路径

之后编辑php.ini文件 (同样不知道php.ini文件在哪里 也是 find / -name php.ini)

增加一行

extension=swoole.so

然后退出 执行命令

php -m

如果显示的扩展中有swoole 那就标识swoole这个扩展安装成功!


TCP协议下的服务端建立以及异步/同步客户端的建立

以我的服务器为例 我新建一个文件夹 取名swoole 

然后新建一个文件夹 TCP

在TCP文件夹下新建文件

server.php(服务端文件)

client.php(同步客户端文件)

async.php(异步客户端文件)

---------------------------------------------------------

先看下server.php代码

set(array(
//    'daemonize' => true,//后台运行
));

/**
 * //注册事件回调函数  -----事件驱动--连接--onConnect
 * $server是服务端的对象
 * $fd是连接的文件描述符 发送数据和关闭连接时需要此参数
 */
$server->on('connect',function ($server,$fd){
    echo '有新的客户端连接,连接标识为--------'.$fd.PHP_EOL;
});

/**
 * //-----事件驱动--接收--onReceive
 * $reactor_id是来自于哪个reactor线程
 * $data,收到的数据内容,可能是文本或者二进制内容
 */
$server->on('receive',function ($server,$fd,$reactor_id,$data){
    echo '接收客户端信息---------'.$data.PHP_EOL;
    //接收之后 返回信息
    $server->send($fd,'服务端接收消息成功!');
});

/**
 * //-----事件驱动--关闭--onReceive
 * $server是服务端的对象
 * $fd是连接的文件描述符 发送数据和关闭连接时需要此参数
 */
$server->on('close',function ($server,$fd){
    echo '客户端关闭-------------'.$fd.PHP_EOL;
});

//启动服务器
$server->start();


该说明的内容都在代码的注释上

接下来是同步客户端

connect('服务器内网ip',9501,5000)){//如果连接成功
    //客户端发送数据
    $client->send('我是张泽山');
};

//接收返回信息  从服务器端接收数据
$response = $client->recv();
echo $response.PHP_EOL;

//关闭客户端
$client->close();

然后是异步客户端代码

on('connect',function($client){
    $client->send("我是异步客户端!");
});
//绑定接收事件
$client->on('receive',function ($client,$data){
    echo "接收消息".$data.PHP_EOL;
});
//绑定错误事件
$client->on('error',function ($client){

});
//绑定关闭事件
$client->on('close',function($client){

});
//连接
$client->connect('服务器内网ip',9501,5000) || exit('连接失败!错误代码:'.$client->errCode);


然后打开xshell 连接服务器

分开两个窗口 一个窗口是执行服务端的php文件 另外一个是执行同步客户端的php文件

如下图所示 左侧是执行服务端 右侧是执行同步客户端

然后先执行左边命令 再执行右边命令 可以看到 客户端向服务端发送了数据  服务端接收到数据之后 返回给客户端信息

如下图所示

 以上就是在TCP协议下的 同步客户端和服务端之间的通信

而异步客户端和服务端的通信也是像上述一样 先执行左边 在执行右边 如下图所示


 UDP协议下的服务端建立以及同步客户端的建立

同样的原理 新建一个文件夹UDP

文件下新建文件

server.php(UDP服务端)

client.php(客户端)

先看服务端代码

set(array(
//    'daemonize' => true,//后台运行
));

/**
 * UDP数据包时回调此函数
 * $server,Server对象
 * $data,收到的数据内容,可能是文本或者二进制内容
 * $client_info,客户端信息包括address/port/server_socket等多项客户端信息数据
 */
$server->on('packet',function ($server,$data,$client_info){
    echo '接收客户端信息---------'.$data.PHP_EOL;
    //接收之后 返回信息  客户端ip 客户端端口 发给客户端的内容
    $server->sendto($client_info['address'],$client_info['port'],'UDP数据接收成功');
});


//启动服务器
$server->start();

然后是客户端代码

sendto('服务器内网ip',9502,'我是张泽山');

//接收返回信息  从服务器端接收数据
$response = $client->recv();
echo $response.PHP_EOL;

查看结果的操作方法和上述一样  先走服务端的执行命令 在走客户端的执行命令

这就是两种协议下的客户端和服务端之间的通信

作为一名菜鸟,刚开始学swoole,请多多指教!

你可能感兴趣的:(PHP)