参考:go措辞中文文档:www.topgoer.com
转自:https://www.jianshu.com/p/c82ba9d11218
运用在终端上的 SAPI 就叫作 CLI SAPI,运用在 Web 做事器中的就叫作 CGI SAPI
php7源码架构
PHP 并没有像 Golang 那样实现 HTTP 网络库,而是实现 了 FastCGI协议。
PHP 定义好输入/输出规范,依据此规范与 PHP 交互的一方都可以称为 Server。这样做的好处便是 Server 方可以忽略 PHP 的内部实现,只要遵守定义好的 SAPI 协议,便可完成交互,极大丰富了 PHP 可以支持的 Server 类型。
Cli (Command Line Interface)Cli 即命令行接口,用于在命令行下 实行 PHP 脚本,Cli 是单进程模式,处理完要求后就直接关闭了
生命周期生命周期
Cli 过程比较大略,这里就不细说了。
Fpm (FastCGI Process Manager)Fpm 是 PHP FastCGI 运行模式的一个进程管理器,Fpm 的核心功能是进程管理
生命周期
从 PHP 5.3.3 开始,PHP 集成了 PHP-FPM。PHP-FPM 供应了更好的 PHP 进程管理办法,可以有效掌握内存和进程,支持平滑重启 PHP 及重载 PHP 配置。
Fpm 用来管理什么进程呢?FastCGI 是 Web做事器(如Nginx、Apache)和处理程序之间的一种通信协议,它是与 HTTP 类似的一种运用层通信协议。把稳:它只是一种协议!
以 Nginx 做事器为例,当有 http 协议要求发送到 Nginx 做事器,Nginx 按照 FastCGI 协议把要求交给 php-fpm 进程处理。
通信过程FastCGI 协议与 Web 做事器合营实现了 HTTP 的处理,Web 做事器来处理 HTTP 要求,然后将解析的结果再通过 FastCGI 协议转发给处理程序,处理程序处理完成后将结果返回给 Web 做事器,Web 做事器再返回给用户
Client/Nginx/PHP-FPM通信示意图
Client 通过 HTTP 办法要求 Nginx,要求由 Nginx 的 worker 进行处理,转成对应的 FastCGI,要求 FPM, accept 由 FPM 的 worker 进程处理,实行完毕再返回给 Nginx, Nginx 再进一步返回给 Client。
PHP 实现了 FastCGI 协议的处理,但是并没有实现详细的网络处理,比较常用的网络处理模型有以下两种。
多进程模型: 由一个主进程和多个子进程组成,主进程卖力管理子进程,基本的网络事宜由各个子进程处理,Nginx采取的便是这种模型。多线程模型: 与多进程类似,只是它是线程粒度,这种模型常日会由主线程监听、吸收要求,然后交由子线程处理,memcached 便是这种模式;有的也是采取多进程那种模式—主线程只卖力管理子线程不处理网络事宜,各个子线程监听、吸收、处理要求,memcached 利用 UDP 协议时采取的是这种模式。进程拥有独立的地址空间及资源,而线程则没有,线程之间共享进程的地址空间及资源,以是在资源管理上多进程模型比较大略,而多线程模型则须要考虑不同线程之间的资源冲突,也便是线程安全。
多进程管理Fpm 是一种多进程模型,它由一个 master 进程和多个 worker 进程组成。master 进程启动时会创建一个 socket,但是不会吸收、处理要求,而是由 fork 出的 worker 子进程完成要求的吸收及处理。
master 进程的紧张事情是管理 worker 进程,卖力 fork 或杀掉 worker 进程,要求多就 frok 新的 worker 进程,空间就杀掉部分子进程。
worker 进程的紧张事情是处理要求,每个 worker 进程会竞争地 Accept 要求,吸收成功后解析 FastCGI,然后实行相应的脚本,处理完成后关闭要求,连续等待新的连接
为什么利用这种模式?从 worker 进程的生命周期可以看到,一个 worker 进程只能处理一个要求,只有将一个要求处理完成后才会处理下一个要求。这与Nginx的事宜模型有很大的差异,Nginx 的子进程通过 epoll 管理套接字,如果一个要求数据还未发送完成则会处理下一个要求,即一个进程会同时连接多个要求,它是非壅塞的模型,只处理生动的套接字。Fpm的这种处理模式大大简化了 PHP 的资源管理,使得在Fpm模式下不须要考虑并发导致的资源冲突。marster 和 worker 通信master 进程与 worker 进程之间不会直接进行通信,master 通过共享内存获取 worker 进程的信息,比如 worker 进程当前状态、已处理要求数等,master 进程通过发送旗子暗记的办法杀掉 worker 进程。
worker 要求处理worker进程的事情周期
master 进程管理woker 创建完成后,对要求的处理事情都会由 worker 进程来进行,而master 进程卖力对worker进程的监控和管理。FPM 可以同时监听多个端口,每个端口对应一个 worker pool。
Fpm 三种不同的进程管理办法:static(静态模式)、dynamic(动态模式)、ondemand(按需模式)
这里紧张说一下在 conf 配置中指定 pm,pm = dynamic。
这种模式比较常用,在 Fpm 启动时会初始化一定数量的 worker。运行期间如果 master 创造要求比较多,worker 处理不过来了则会 fork worker 进程,如果 master 创造闲着的 worker 太多了,则会杀掉一些 worker,避免占用过多资源master通过这4个值来动态掌握 worker 的数量
pm.start_servers 初始化一定数量的 workerpm.min_spare_servers 最小 worker 数pm.max_children 最大 worker 数pm.max_spare_servers 空闲 worker 数SocketNginx 做事器和 PHP-FPM 可以通过 TCP Socket 和 UNIX Socket 两种办法实现
UNIX Socket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。这种办法须要在Nginx配置文件中填写PHP-FPM的pid文件位置,效率要比 TCP Socket 高。TCP Socket 的优点是可以跨做事器,当Nginx和PHP-FPM不在同一台机器上时,只能利用这种办法。FastCGI 协议FastCGI 是一种协议,它是建立在 CGI/1.1 根本之上的,把 CGI/1.1 里面要通报的数据通过 FastCGI 协议定义的顺序和格式进行通报。全体 FastCGI 是二进制连续通报的。
详细内容就不细解了。
总结全体 FPM 模式实际上是多进程模式,首先由 calling process 进程 fork 出 master 进程,master 进程会创建 Socket,然后 fork 出 worker 进程,worker 进程会在 accept 处壅塞等待,要求过来时,由个中一个worker 进程处理,按照 FastCGI 模式进行各阶段的读取,然后解析 PHP 并实行,末了按照 FastCGI 协议返回数据,连续进入 accept 处壅塞等待。其余,FPM 建立了计分板机制,可以关注全局和每个 woker 的事情情形,方便利用者监控。