目录
  • 初识网络通信
    • 什么是网络通信
  • swoole介绍
    • swoole 简介
    • swoole提供的功能库
    • swoole的框架
      • Swoft
      • EasySwoole
      • SwooleDistributed
  • 环境搭建
    • swoole自定义安装
    • 配置到php.ini
  • swoole初体验
    • TCP服务
      • server端
      • 客户端

初识网络通信

什么是网络通信

我们常见访问某个网站,如访问百度,腾讯,新浪等网站,他是通过http服务协议进行访问,这种就叫做网络通信,如下简易示意图

swoole就是这个网络通信的佼佼者,接下来我们来学习swoole

swoole介绍

swoole 简介

swoole是PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。

Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。

swoole提供的功能库

swoole提供了哪些功能给我们用,以为我们用到哪些服务时,可以用swoole来帮我们实现。

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

如果你的业务中,有用到以上等特性,你又在用使用php,那么完全可以用swoole来完成了,再具体点的场景如下:

1、互联网
2、移动通信
3、企业软件
4、云计算
5、网络游戏
5、物联网(IOT)
6、车联网
7、智能家居等领域

swoole的框架

Swoft

首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,
全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用,没有复杂的异步回调,没有繁琐的 yield, 有类似 Go 语言的协程、灵活的注解、
强大的全局依赖注入容器、完善的服务治理、灵活强大的 AOP、标准的 PSR 规范实现等等,可以用于构建高性能的Web系统、API、中间件、基础服务等等。

EasySwoole

EasySwoole 是一款基于Swoole Server 开发的常驻内存型PHP框架,专为API而生,摆脱传统PHP运行模式在进程唤起和文件加载上带来的性能损失。

EasySwoole 高度封装了Swoole Server 而依旧维持Swoole Server 原有特性,支持同时混合监听HTTP、自定义TCP、UDP协议,让开发者以最低的学习成本和精力编写出多进程,可异步,高可用的应用服务。

SwooleDistributed

SwooleDistributed 老牌Swoole框架拥有最完善的开发工具以及最强大的功能,首创SDHelper开发者工具包和开发者调试命令集,可以进行单元测试,
捕获客户端流量分析,可视化的进行远程断点联调,还具备代码覆盖率检测的功能(swoole与xdebug扩展不兼容,SDHelper无需xdebug扩展),
并且内置组件极其丰富(类MQTT强悍的订阅发布/Actor模型/内存高速缓存/事件派发/进程管理/定时任务/AMQP任务调度/后台监控/集群/微服务/RPC/异步连接池/自定义命令等等),
开发者可以直接使用加快开发进度。

几乎所有的功能都支持集群化,单机切换到集群无需对代码做任何的修改。

如果业务开发比较复杂比如(游戏开发)那么SD框架将是你的不二之选

环境搭建

环境:centos7+nginx1.18+php7.4+mysql5.7+swoole4.48

swoole自定义安装

[root@localhost /]# cd /root 
[root@localhost root]# tar -xvf swoole-src-4.4.12.tar.gz 
[root@localhost root]# cd swoole-src-4.4.12 
[root@localhost swoole-src-4.4.12]# phpize 
[root@localhost swoole-src-4.4.12]# ./configure 
[root@localhost swoole-src-4.4.12]# make 
[root@localhost swoole-src-4.4.12]# sudo make install

注 !! 在执行 ./configure 的时候容易会出现如下错误

configure: error: Cannot find PHP-config. Please use --with-php-config=PATH

问题的意思就是因为PHP的配置文件没有找到,需要额外的指定如下

[root@localhost swoole-src-4.4.12]# ./configure --with-php-config=/usr/local/php/bin/php-config

你可以通过下面的命令既可以查找到php-config的文件地址

[root@localhost swoole-src-4.4.12]# find / -name php-config 
/www/server/php/73/src/scripts/php-config 
/www/server/php/73/bin/php-config

所以我的安装执行是

[root@localhost swoole-src-4.4.12]# ./configure --with-php-config=/www/server/php/73/bin/php-config 
[root@localhost swoole-src-4.4.12]# make 
[root@localhost swoole-src-4.4.12]# sudo make install

配置到php.ini

[root@localhost swoole-src-4.4.12]# find / -name php.ini 
/www/server/php/73/etc/php.ini 
[root@localhost swoole-src-4.4.12]# vi /www/server/php/73/etc/php.ini

添加

extension=swoole.so

然后通过php -m检测
最后就是重启即可

[root@localhost swoole-src-4.4.12]# /etc/init.d/php-fpm-73 restart 
Reload service php-fpm done

swoole初体验

TCP服务

server端

点击查看代码
use Swoole\Server;

/*$server = new Server("0.0.0.0",9500);

$server->set([
    //设置进程
    'work_num' => 2
]);

//监听事件
$server->on('connect',function (){
    echo "有新的连接进来".PHP_EOL;
});

$server->on('message',function (){
    echo "有新的消息".PHP_EOL;
});

//关闭
$server->on('close',function (){
    echo "服务器关闭啦!".PHP_EOL;
});

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

$server = new Server('0.0.0.0', 9503);

$server->on('start', function ($server) {
    echo "TCP Server is started at tcp://127.0.0.1:9503\n";
});

$server->on('connect', function ($server, $fd){
    echo "connection open: {$fd}\n";
});

$server->on('receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Swoole: {$data}");
});

$server->on('close', function ($server, $fd) {
    echo "connection close: {$fd}\n";
});

$server->start();

客户端

点击查看代码
use Swoole\Client;

//实例化
$client = new Client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_SYNC);

//连接
$client->connect('127.0.0.1',9503);

//fd+id = swoole才能识别当前客户端身份
//发送消息
$client->send("我是客户端");

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

更多文章请关注《万象专栏》