侧边栏壁纸
博主昵称
流苏小筑

步伐虽小,密而不止

PHP-FPM(FastCGI Process Manager)详解

2022年10月10日 110阅读 0评论 0点赞

PHP-FPM(FastCGI Process Manager)详解

PHP-FPM(FastCGI Process Manager)是 PHP 的一种进程管理器,旨在提高 PHP 在高并发环境下的性能。它是 FastCGI 协议的一种实现.
m49wrjh4.png


1.说到FastCGI就要先说下CGI,什么是CGI?

CGI 是最早的 Web 编程接口之一,它允许 Web 服务器与外部程序(如 PHP 脚本)进行交互。CGI 每次处理一个请求时,都会创建一个新的进程来执行相关的程序。这意味着每次客户端发送请求时,CGI 都会启动一个新的 PHP 进程来处理请求,执行完毕后再终止该进程。
m49wt0sx.png

工作原理:

  1. 当收到web server请求后,会启动对应的CGI程序,这里就是PHP的解析器(php-cgi)
  2. 接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定的CGI规定的格式返回处理后的结果
  3. 退出进程。(CGI每次接收到请求都会执行这些步骤)
  4. 优点:
    简单且易于实现。
    与 Web 服务器无关,能够处理任意外部程序。
  5. 缺点:
    性能差:每次请求都要启动一个新的进程,开销非常大,导致性能瓶颈。
    资源浪费:每个请求需要启动并销毁进程,导致大量的内存和 CPU 资源消耗。

2.FastCGI

FastCgi是cgi的改进版,对比cgi每次请求都要新建一个进程,fastcgi引入了进程池的概念,不会每个请求创建一个新进程,而是复用已经存在的进程,请求处理结束后,也不会销毁进程,而是将进程放回进程池中,等待下一次请求使用。

m49x3uvn.png

工作原理:

  1. web服务器启动时,载入FastCGI管理器
  2. FastCGI自身初始化,并且启动多个cgi解释器(PHP-CGI),并且等待web服务器的链接
  3. 当请求到达时,FastCGI进程管理器选择一个cgi解释器(php-cgi)进行连接,web服务器将请求数据发送给cgi解释器(php-cgi)
  4. php-cgi处理完成后,将返回结果返回给web服务器,关闭和web服务器的连接,web服务器返回给客户端。php-cgi继续等待后续请求。

-改进:引入TCP协议和unix套接字。

  • 缺点:进程池管理不够灵活。

3.CGI与FastCGI比较

1.对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重新初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。
2.由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。


4.PHP-FPM

首先要说的是:fastcgi是一个协议,php-fpm实现了这个协议。
php-cgi是php的解释器,只是一个cgi程序,它只能解析请求,返回数据,不会进程管理,所以php-fpm就是这样能够管理php-cgi进程的一个东西。实现了php的平滑重启。

PHP-FPM三种模式
1.static模式
static模式始终会保持一个固定数量的子进程,这个数量由pm.max_children定义。

2.dynamic模式
子进程的数量是动态变化的,启动时,会生成固定数量的子进程,可以理解成最小子进程数,通过pm.start_servers控制,而最大子进程数则由pm.max_children控制,子进程数会在pm.start_servers~pm.max_children范围内波动,另外,闲置的子进程数还可以由pm.min_spare_servers和pm.max_spare_servers两个配置参数控制。换句话说,闲置的子进程也可以由最小数目和最大数目,而如果闲置的子进程超过pm.max_spare_servers,则会被杀掉。

3.ondemand模式
这种模式和dynamic模式相反,把内存放在第一位,每个闲置进程在持续闲置了pm.process_idle_timeout秒后就会被杀掉。有了这个模式,到了服务器低峰期,内存自然会降下来,如果服务器长时间没有请求,就只有一个主进程,当然其弊端是,遇到高峰期或者pm.process_idle_timeout设置太小,无法避免服务器频繁创建进程的问题。

0

—— 评论区 ——

昵称
邮箱
网址
取消