---
title: 'PHP-FPM与FastCGI的关系'
pubDate: 2018-05-08
tags:
  - 'php'
description: '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实现对每个请求都会执行这些步骤：

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的进程。

_先这样吧_

若有错误之处请指出，更多地关注[煎鱼](http://www.jianyujianyu.com)。
