一 、fpm
1、描述:
在对应的服务器上启动php-fpm服务;
Master 主进程 / Worker 多进程模式,启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求;
当nginx转发请求时,Master主进程fork一个Work进程处理请求;
每个 Worker 进程只能处理一个请求:初始化模块 -> 初始化php代码 -> 执行php脚本 -> 结束请求 -> 关闭模块;
2、流程:
二、Swoole
1、描述:
Swoole 采用的也是 Master/Worker 模式,不同的是 Master 进程有多个 Reactor 线程,Master 只是一个事件发生器,负责监听 Socket 句柄的事件变化。Worker 以多进程的方式运行,接收来自 Reactor 线程的请求,并执行回调函数(PHP 编写的)。启动 Master 进程的流程大致是:
初始化模块。
初始化请求。因为 swoole 需要通过 cli 的方式运行,所以初始化请求时,不会初始化 PHP 的全局变量,如 $_SERVER, $_POST, $_GET 等。
执行 PHP 脚本。包括词法、语法分析,变量、函数、类的初始化等,Master 进入监听状态,并不会结束进程;
2、流程:
三、总结
1、fpm:
Master 主进程 / Worker 多进程模式;
启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求;
每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码;
PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作;
只用于 HTTP Server;
2、swoole:
Master 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式;
启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化;
Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程;
每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码;
只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程;
不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接;
3、比较:
由 Reactor(epoll 的 IO 复用方式)负责监听 Socket 句柄的事件变化,解决高并发问题;
通过内存常驻的方式节省 PHP 代码初始化的时间;