初识swoole
swoole官网:https://www.swoole.com/
可能需要掌握一些tcp/ip
- 入门书籍:《tcp/ip网络编程(尹圣雨 韩)》。
- 深入书籍:《unix环境高级编程(中文第三版)》;《unix网络编程卷1:套接字联网》;《unix网络编程卷2:进程间通信》。
题外话
swoole补充了对比其他语言没有的网络编程库,紧接着学习swoft框架,微服务。最后通过swoole可以进一步学习go语言。
swoole vs workman
swoole是C语言编写,不依靠php的扩展。workman依赖php的扩展。swoole的特性更丰富、稳定性好一些,但workman可以用来了解背后的基本原理。
基于swoole扩展的框架
- swoft 社区比较活跃
- easyswoole 相对简单 轻量级
- swooleDistributed
传统框架和swoole框架
swoole框架在性能方面比传统框架要高很多,没有性能要求则使用传统框架。
版本
已更新至4.3。swoole2.0增加协程。swoole3.0以上版本要求php>=7.0。
开发工具
这两个还是蛮实用的。
IDE helper包下载后放进任意目录,然后IDE include path即可。
学习swoole 的注意事项
- swoole一般是linux环境。
- 阿里云安全组开放协议、端口。服务器如有防火墙,开放端口。
一些概念
swoole入门指引
swoole底层是C写的。swoole系列函数可以理解为swoole提供给php的api,php通过swoole系列函数调用swoole的api,来启动swoole服务、注册回调函数等,swoole的事件驱动来执行对应的回调函数。这完全区别于普通的php扩展只提供库函数,而对于swoole,php只是传递的作用,真正的程序控制权是swoole。
学习swoole的基础知识
linux是必须的。学习swoole需要对进程线程、异步同步、IO复用、reactor模型、进程间通讯、信号等概念有所了解,可学习《tcp/ip网络编程》这本书做简单的理解,通过php对应的扩展,借鉴workman源码来理解机制,这样会对swoole的学习有很大帮助。
swoole的实现
swoole并没有用libevent,所以不需要安装libevent。swoole并不依赖php的stream/sockets/pcntl/posix/sysvmsg等扩展
libevent是一个事件驱动库,php有对应的event扩展,可帮助理解swoole的io复用和事件机制。
stream/sockets是网络通讯的工具、可帮助理解swoole的tcp/udp/http。
pcntl/posix是进程控制扩展,可帮助理解swoole中的多进程、进程间通讯。
sysvmsg消息队列,可帮助理解swoole中的task模块。
swoole进程结构
- Master主进程
- manager管理进程
- worker子进程
- task任务进程
- MainReactor主线程
- reactor线程组
Swoole的进程/线程模型:
Swoole程序的执行流程:
这里暂不介绍了,接下来会逐渐涉及。
Server部分文档概述
swoole我也是初学,理解不到位的请谅解。
整体
从server入手
函数列表
这里的意思是$server
对象可以调用的函数,接下来理解下这部分。
比如我们用__construct先创建一个$server
。
$server = new Server(
string $host, //监听的Ip地址,通常为0.0.0.0,监听所有ip地址
int $port = 0, //端口
int $mode = SWOOLE_PROCESS,//默认多进程模式
int $sock_type = SWOOLE_SOCK_TCP);//TCP UDP 默认TCP
// 创建server
$server=new Swoole\Server("0.0.0.0",6001);
那么函数列表里的函数,是$server
调用的。
可能在外层调用:
1) server :: __construct 构造函数 创建一个tcp/udp服务器
$server=new Swoole\Server("0.0.0.0",6001);
2)server->set 为服务器配置选项
$server->set([
'worker_num'=>1, //子进程数量
]);
3)server->on 注册事件
$server->on('connect',function(){
echo "new connect!".PHP_EOL;
});
$server->on('receive',function(){
echo "new message received!".PHP_EOL;
});
$server->on('close',function(){
echo "one client closed!".PHP_EOL;
});
4)server->start 启动服务器
$server->start();
也可能在回调中调用:server->send
server->close
$server->on('receive',function($server, $fd){
$server->send($fd, 'Swoole: '.$data);
$server->close($fd);
});
总之函数下的所有函数是$server调用的。
属性列表
这个没什么好说的,获取配置项,获取主进程pid,获取当前子进程编号id等等。
配置选项
配置选项在server->set
函数中设置,比如设置子进程数量:
$server->set([
'worker_num'=>1,
]);
以此类推,放进数组里即可。
监听端口
监听端口是swoole支持多协议多端口,即一个服务器上(一个php文件代码上)可以支持多个协议的业务,可以监听多个端口,这就厉害了,不用另外创建一个单独的服务器(再写一个php脚本)。
下面的可选参数,可选回调什么意思呢?
比如监听一个新的端口:
//主服务器 $server->
$server=new Swoole\Server("0.0.0.0",6001);
$server->set([
'worker_num'=>1,
]);
$server->on('connect',function(){
});
$server->on('receive',function($server, $fd){
});
$server->on('close',function(){
});
//监听一个新端口 注意下面都是$port1->
$port1 = $server->listen("0.0.0.0", 9501, SWOOLE_SOCK_TCP);
$port1->set([
//可选参数
]);
//可选回调
$port1->on('connect',function(){
});
$port1>on('receive',function($server, $fd){
});
$port1->on('close',function(){
});
下面的port1,->set支持的参数,->on支持的回调,是有限制的。它和server不是平级的,也就是说有些参数和回调是server级别的。比如->set([‘worker_num’=>1])是server独有的配置参数,port1不能配置。哪些参数可以配置,哪些不可以配置,文档中有说明,需要注意这点。
预定义常量
看看就好
事件回调函数
事件回调函数是在server->on()中配置的。上边已有很多示例了,只需要各自了解使用场景就好。
好了,整个server的大体已经了解完了