PHP-FPM与FastCGI的关系

Published by 煎鱼 on

突然发现整理了很多笔记,应该放这里做备用

CGI

CGI,是一个规范,是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。

如果请求/index.html,web server会去文件系统中找到这个文件,发送给浏览器。如果请求的是/index.php,按照nginx配置,请求回连同数据给PHP解析器来处理,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

FastCGI

FastCGI,是一个协议,是用来提高CGI程序性能的。

标准的CGI实现对每个请求都会执行这些步骤:

  1. PHP解析器会解析php.ini文件
  2. 初始化执行环境

如果每次都需要执行这些操作,则将会多出很多重复多余的操作。如php的配置文件段时间内是不会改变的,那么在这段不改变的时间内,要是有一万个请求,那么环境就要初始一万次。这对于计算资源和时间资源来说,是一种浪费。

对此,FastCGI会如此进行优化:

  1. 首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境
  2. 然后再启动多个worker
  3. 当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。

FASTCGI是常驻型的CGI,它可以一直运行,在请求到达时,不会花费时间去fork一个进程来处理。

PHP-CGI

PHP的解释器是PHP-CGI。PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果。
当每次接到HTTP前端服务器的请求都会开启一个PHP-CGI进程进行处理,而且开启的php-cgi的过程中会先要重载配置,数据结构以及初始化运行环境。

简单来说,PHP-CGI就是实现了CGI,拥有了CGI的慢的缺点。

PHP-FPM

PHP-FPM是一个实现了FastCGI的程序,被PHP官方收了。

PHP-FPM可以说的是对PHP-CGI的改进,改进在于它吸取了FastCGI的优点。PHP-FPM会开启多个PHP-CGI程序,并且PHP-FPM常驻内存,因为PHP-FPM是管理PHP-CGI的进程。

先这样吧

若有错误之处请指出,更多地关注煎鱼

Categories: PHP

发表评论

电子邮件地址不会被公开。 必填项已用*标注