面试官: PHP 的 CLI 模式和 FPM 有什么区别和联系
我:不知道!

其实我对这个问题 也不甚很懂 一直都是这么用 没想过都是些啥玩意 然后搜索了好久 网上的答案真是众说纷纭 讲什么的都有 看的越来越晕

下面是自己整理的一些内容。

SAPI 是什么
SAPI 全称 Server Application Programming Interface 直译过来 服务端应用编程端口

SAPI 是一个应用程序编程接口 (API)由 Web 服务器提供,以帮助其他开发人员扩展 Web 服务器功能。

例如,PHP 有一个名为 SAPI 的直接模块接口,用于不同的 Web 服务器;在 Windows 下的 PHP 5 和 Apache 2.0 的情况下,它以 DLL 文件的形式提供,名为 php5apache2.dll,这是一个模块,除了其他功能之外,还提供 PHP 和 PHP 之间的接口。 Web 服务器,以服务器理解的形式实现。这种形式就是所谓的 SAPI。
在 PHP 中实现了 SAPI 的还包括 CGI 和 CLI

CGI 是什么
CGI 全称 Common Gateway Interface 直译过来 通用网关接口

CGI 是一个协议规范 为 WebServer 提供标准协议,以执行在运行生成网页的服务器上运行的控制台应用程序(也称为命令行界面程序)之类的程序。

这些程序称为 CGI 脚本或简称为 CGI。服务器执行脚本的具体细节由服务器确定

在说的简单点就是他规范了 WebServer 传递数据的格式 必须按这个来 不能乱搞

PHP-CLI 是什么
CLI 全称 command-line interface 直译过来 命令行接口 维基上 是 命令行界面

一般我们在 Linux 操作系统时是没有操作界面的(别问我为什么),那要怎么才能执行程序或者对程序进行编译

这个时候就需要一些实现了 CLI 的工具, PHP-CLI 就是这样一个程序 可以在命令行下直接运行 PHP 程序 常用来开发 PHP 的外壳应用 后台应用

FastCGI 是什么
FastCGI 全称 Fast Common Gateway Interface 直译过来 快速通用网关接口

是一种让交互程序与 Web 服务器通信的协议

FastCGI 致力于减少网页服务器与 CGI 程序之间交互的开销,从而使服务器可以同时处理更多的网页请求
CGI 使外部程序与 Web 服务器之间交互成为可能。CGI 程序运行在独立的进程中,并对每个 Web 请求创建一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量创建和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。

说白了它和 CGI 一样都是协议 是一个增强版本而已 其主要目的是为了提高 CGI 的效率和性能

FastCGI 的实现
FastCGI 本身还是一个协议 他致力于提高 CGI 性能 那么怎么实现提高性能呢

与为每个请求创建一个新的进程不同,FastCGI 使用持续的进程来处理一连串的请求。这些进程由 FastCGI 服务器管理,而不是 web 服务器。 当进来一个请求时,web 服务器把环境变量和这个页面请求通过一个 socket 比如 FastCGI 进程与 web 服务器(都位于本地)或者一个 TCP connection(FastCGI 进程在远端的 server farm)传递给 FastCGI 进程。

引用下大佬的回复

提高性能,那么 CGI 程序的性能问题在哪呢?”PHP 解析器会解析 php.ini 文件,初始化执行环境”,就是这里了。标准的 CGI 对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个时间的时间会比较长。这明显不合理嘛!那么 Fastcgi 是怎么做的呢?首先,Fastcgi 会先启一个 master,解析配置文件,初始化执行环境,然后再启动多个 worker。当请求过来时,master 会传递给一个 worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当 worker 不够用时,master 可以根据配置预先启动几个 worker 等着;当然空闲 worker 太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是 fastcgi 的对进程的管理。

FastCGI 的不足
因为是多进程,所以比 CGI 多线程消耗更多的服务器内存

PHP-FPM 是什么
FPM 全称 FastCGI Process Manager 直译过来 FastCGI 进程管理器

PHP-FPM: PHP 的 FastCGI 进程管理器 只能用于 PHP 是一个实现了 FastCGI 的程序 它管理的并不是 FastCGI (协议怎么管理…) 而是执行 PHP 过程中的进程

PHP-FPM 提供了更好的 PHP 进程管理方式,可以有效控制内存和进程、可以平滑重载 PHP 配置,比 spawn-fcgi 具有更多优点,所以被 PHP 官方收录了。在./configure 的时候带 –enable-fpm 参数即可开启 PHP-FPM