[TOC]
# Swoole 的运行模式
******
注:以下内容主要指:`SwooleServer`。
<br />
## Swoole 做了什么
`Swoole` 是 php 的一个扩展,但是他又不是普通的扩展,其最明显的特点就是:**一旦运行后就会接管 PHP 的控制权,进入事件循环。当某种 IO 事件发生时,`Swoole` 会回调开发者设置的指定 PHP 函数。**
也就是说 `SwooleServer` 更像是一个用 `C` 语言封装好的一个 `Tcp/Udp` 支持 `多线程`,`EventLoop`,`事件驱动`,`异步` 等功能的框架。开发者不需要关心底层的各种实现,直接在业务层面进行开发即可。
<br />
## 什么是 IO 事件
很多 php 程序员没有使用过其他语言开发 Server,也不太了解除了 php-fpm 以外运行模式的 php 程序,初次使用 Swoole 时总是会有各种摸不到头脑的事情。其实 IO 我们经常提起如:`磁盘 IO`,`网络 IO`,在这里 Swoole 所指的 IO 时间实际上指 `网络 IO` 事件。
在日常生活中你留下了一个邮箱,当有人给你发送邮件的时候,你就会收到邮件提醒;而对于你而言,你并不关心邮件时如何送达的,你只关心你有没有收到邮件,当你收到邮件之后会根据邮件的内容和发送人去做各种各样的处理。在这个比喻中,**Swoole 就承担了底层网络事件的监听及各种底层事件处理,当收到邮件(请求)时,会触发收件(接收)提醒,然后将控制权转交给你(预先注册的事件回调函数),来进行后续的处理。**
<br />
## Swoole 的运行流程
### 初始化
```php
<?php
// new 一个SwooleServer 对象 并指定监听端口和运行模式 以及 socket 类型
// 此时的一切一切都是开发者进行配置的时间,没有任何其他事情发生
$server = new Swoole\Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
// 设置运行参数,就像你平时做的那样,给 $server 对象配置相关的参数
$server->set([
'worker_num' => 4, // 工作进程数量
'daemonize' => true, // 是否以守护进程模式运行
'backlog' => 128, // listen 队列长度
]);
// 注册时间回调函数
// 这里指 当底层Tcp新连接进入事件时,交给 Tcp 类的 onConnect 静态方法处理
$server->on('Connect', [Tcp::class, 'onConnect']);
// 这里指 当收到数据时 交给 Tcp 类的 onReceive 静态方法处理
$server->on('Receive', [Tcp::class, 'onReceive']);
// 这里指 当 Tcp 客户端连接关闭时,交给 Tcp 类的 onClose 静态方法处理
$server->on('Close', [Tcp::class, 'onClose']);
```
在上面的示例当中,实际上 Swoole 还尚未启动,但是我们已经预先配置了许多必要的配置条件。鉴于有的新人还尚不了解什么叫做 `回调函数`,在这里我简单的讲解一下:
> 所谓的 `回调函数(Callback)` 就好比是张开了夹子的捕鼠器,我们设定当有老鼠踩到捕鼠器的时候,他会关闭夹子然后捉住老鼠,我们放置捕鼠器的时候,捕鼠器并没有真的抓老鼠。这个设定就是回调,他不立刻执行,会在遇到触发条件(事件)时执行,在上面的示例当中我们放置了3个捕鼠器(回调函数),我们只需要知道他会在特定老鼠(事件)踩到的时候(发生的时候)去执行我们期待的功能就好。
<br />
### Server start
```php
<?php
// 启动 Swoole Server 将由 Swoole 接管php 运行
$server->start();
```
至此 Swoole 完全的接管了 php 的运行,并且监听相应端口并当发生事件时去执行开发者自定义的事件回调。
<br />
### 仅仅如此吗?
事实上 Swoole 在启动的时候做了非常多的事情:
> Swoole 运行流程图:
> ![](https://box.kancloud.cn/2016-08-30_57c5268f86e00.jpg)
> Swoole 进程关系图:
> ![](https://img.kancloud.cn/73/58/73588dc2dbec15058e07c252225e49f1_978x744.png)
上图中我们可以了解,Swoole 会创建一个 `Manager` 进程专门管理 `Work` 和 `Task` 进程。而 `Work` 进程则直接通过 `Unix Socket` 和 `Master` 进程通讯。
<br />
## 待续
- 引言
- Introduction
- 运行模式
- php-fpm
- php-cli
- 基础介绍
- 网络协议
- ip
- tcp
- tcp
- http
- webSocket
- udp
- port端口
- 会话管理
- cookie
- session
- api/token
- linux基础
- lnmp安装
- 命令
- 进程管理
- 扩展安装
- 端口监控
- 防火墙说明
- php7.0
- 部分新特性
- php回调/闭包
- 回调事件
- 闭包/匿名函数
- php多进程
- 多进程开启
- 进程通信
- 进程信号
- 僵尸进程
- 孤儿进程
- 守护进程
- 同步/异步
- 阻塞/非阻塞
- 协程
- Swoole
- 初始Swoole
- 运行机制
- 生命周期
- composer使用
- EasySwoole
- 设计理念
- 组件说明
- 运行过程
- demo
- 提问的艺术