PHP-FPM与FastCGI的关系
突然发现整理了很多笔记,应该放这里做备用
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实现对每个请求都会执行这些步骤:
- PHP解析器会解析php.ini文件
- 初始化执行环境
如果每次都需要执行这些操作,则将会多出很多重复多余的操作。如php的配置文件段时间内是不会改变的,那么在这段不改变的时间内,要是有一万个请求,那么环境就要初始一万次。这对于计算资源和时间资源来说,是一种浪费。
对此,FastCGI会如此进行优化:
- 首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境
- 然后再启动多个worker
- 当请求过来时,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的进程。
先这样吧
若有错误之处请指出,更多地关注煎鱼。