若转载教程,请注明出自SW-X框架官方文档

1、PHP-FPM进程管理方式介绍

PHP-FPM采用的是Master/Worker进程模型。当PHP-FPM启动时,会读取配置文件,然后创建一个Master进程和若干个Worker进程(具体是几个Worker进程是由php-fpm.conf中配置的个数决定)。
Worker进程是由Master进程fork出来的。

  1. Master进程和Worker进程的作用如下:
  2. Master进程:负责管理Worker进程、监听端口Worker进程:处理业务逻辑

image.png

2、多进程同步阻塞模式

当客户端发送一个请求时,web server会通过一个php-fpm进程(这里和下文所说指的fpm进程都是fpm开启的worker进程,关于fpm的工作原理这里不再累述)去执行php代码,php代码的执行是单线程的。
那么,当有多个客户端同时发送请求时(并发),web server会通过php-fpm为每个请求开启一个单独进程去执行php代码。
请求执行过后,空闲的php-fpm进程被销毁,内存得以释放。
但并发的问题在于,在某一时间,客户端请求让php-fpm进程数量达到了最大限制数,这个时候,新来的请求只能等待空闲的php-fpm进程来处理,这就是多进程同步阻塞模式的弊端,当然还有进程过多所带来的内存占用问题。

3、一主多从

php-fpm是一种master(主)/worker(子)多进程架构。
master进程主要负责CGI及PHP环境初始化、事件监听、子进程状态等等,worker进程负责处理php请求。
HP-FPM进程管理方式有动态(Dynamic)、静态(Static)、按需(Ondemand)三种,下面将一一介绍。

动态(Dynamic)

在这种方式下,PHP-FPM启动时会创建一定数量的Worker进程。
当请求数逐渐增大时,会动态增加Worker进程的数量;当请求数降下来时,会销毁刚才动态创建出来的Worker进程。
在这种方式下,如果配置的最大进程数过大,当请求量增加时会出现大量Worker进程,进程之间会频繁切换,浪费大量CPU资源。
下面的三个参数可以配置Worker进程的数量:

  1. pm.start_servers:动态方式下的起始php-fpm进程数量。
  2. pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
  3. pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

静态(Static)

这种方式下,PHP-FPM启动时会创建配置文件中指定数量的Worker进程,不会根据请求数量的多少而增加减少。
因为PHP-FPM开启的每个Worker进程同一时间只能处理一个请求,所以在这种方式下当请求增大的时候,将会出现等待的情形。
下面的参数可以配置Worker进程的数量:

  1. pm.max_children:静态方式下开启的php-fpm进程数量。

按需(Ondemand)

在这种方式下,PHP-FPM启动时,不会创建Worker进程,当请求到达的时候Master进程才会fork出子进程。
在这种模式下,如果请求量比较大,Master进程会非常繁忙,会占用大量CPU时间。
所以这种模式不适合大流量的环境。
在Nginx+PHP-FPM的架构中,Web服务器是如何与PHP-FPM通信的呢?
image.png
当用户请求一个http地址时,Nginx会收到请求,然后将请求转发给PHP-FPM,PHP-FPM收到请求后会将请求转发给一个空闲的Worker进程。
当Worker进程处理完后会将结果返回给Nginx,Ngixn再讲内容返回给用户。