HP 有五种运行模式,常见的有 4 种:

CGI(通用网关接口 / Common Gateway Interface)
FastCGI(常驻型 CGI / Long-Live CGI)
CLI(命令行运行 / Command Line Interface)
LoadModule【Apache 独有】
ISAPI(Internet Server Application Program Interface)【IIS 独有】
备注:在 PHP5.3 以后,PHP 不再有 ISAPI 模式,安装后也不再有 php5isapi.dll 这个文件。要在 IIS6 上使用高版本 PHP,必须安装 FastCGI 扩展,然后使 IIS6 支持 FastCGI。

查看当前运行模式
echo php_sapi_name();

CGI 模式

介绍:

CGI 即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲 CGI 就象是一座桥,把网页和 Web 服务器中的执行程序连接起来,它把 HTML 接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给 HTML 页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

调用过程:Fork-And-Execute 模式

用户请求 —> web 服务器接收请求【常用 Nginx、apache】—> fork CGI 的子进程 & 处理请求 —-> 请求处理完毕,返回结果到 web 服务器 & 销毁子进程 —> web 服务器返回结果给用户

图解:

优势:

作为 PHP 最早的运行模式,每次请求都独立处理,调用过程足够简单清晰,可控性强
进程间是隔离的,保证数据不会被污染

劣势:

每次请求都需要 fork 一个新的 CGI 子进程,假如同一时间并发请求一千,意味着就要 fork 一千个子进程,这就会导致几个问题:

fork 子进程需要时间,需要占用内存【copy-on-write】
子进程过多,会导致 CPU 将大量的时间花费在上下文切换上
每次请求需要重新加载相关资源
FastCGI 模式

介绍:

FastCGI 是 CGI 的升级版本,FastCGI 像是一个常驻 (long-live) 型的 CGI,在启动 web 服务器的时候载入 FastCGI 进程管理器【PHP-FPM、IIS ISAPI、Apache Module】,当有请求过来的时候,web 服务器只需要交给 FastCGI 进程管理器处理即可。
调用过程:以 PHP-FPM 为例

web 服务器启动的时候 启动 PHP-FPM master 进程(主要负责分配请求给空闲的自子进程处理)以及一定数量的 fast-cgi 子进程(负责处理请求)。 PHP-FPM master 进程管理一个进程池,池里有若干个 fast-cgi 子进程,每个 fast-cgi 子进程单独处理一个请求,互不干涉。

用户请求 —> web 服务器接收请求【常用 Nginx、apache】—> 检测到是 PHP 请求 & 转发给 FPM master 进程 —> FPM master 进程 指定空闲 fast-cgi 子进程处理请求 —> 子进程载入文件(如 php.ini)及其他资源处理请求 —> 处理结束 & 清除资源,结果返回 master & 子进程挂起,标记为空闲 —> master 将结果返回 web 服务器 —> web 服务器返回结果给用户

图解:

 

优势:

从稳定性上看,FastCGI 是以独立的进程池来运行 CGI,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑
从安全性上看,FastCGI 和宿主的 web Server 完全独立,FastCGI 不会影响 web 服务器的运行【如果 PHP-FPM 处于关闭状态,则会返回 502 bad gateway 给用户】
从性能上看,FastCGI 把动态逻辑的处理从 web Server 中分离出来,大负荷的 IO 处理还是留给宿主 Server,这样宿主 Server 可以一心一意作 IO【对于一个普通的动态网页来说,逻辑处理可能只有一小部分,更多的是图片等静态资源的加载】
劣势:

一个 fast-cgi 子进程同一时间只能处理一个请求,所以网站的并发性能就受限于子进程数量
如果开启的进程过多,会导致 CPU 将大量的时间浪费在进程的上下文切换上。
每次请求 fast-cgi 子进程都需要重新加载相关资源,请求结束需要释放资源

CLI(命令行运行 / Command Line Interface)

简介:

php-cli 模式属于命令行模式,对于很多刚开始学 php 就开始 wamp,wnmp 的开发者来说是最陌生的一种运行模式
该模式不需要借助其他程序,直接输入 php xx.php 就能执行 php 代码
命令行模式和常规 web 模式明显不一样的是:
没有超时时间
默认关闭 buffer 缓冲
STDIN 和 STDOUT 标准输入 / 输出 / 错误 的使用
echo var_dump,phpinfo 等输出直接输出到控制台
可使用的类 / 函数 不同
php.ini 配置的不同

PS:详见官方文档:www.php.net/manual/zh/features.com...

LoadModule(Apache 独有)

简介:
模块模式是以 mod_php5 模块的形式集成,此时 mod_php5 模块的作用是接收 Apache 传递过来的 PHP 文件请求,并处理这些请求,然后将处理后的结果返回给 Apache。
在 Apache 配置文件 httpd.conf 里,通常加的 LoadModule php7_module “D:/…/php71/php7apache2_4.dll” 起到的作用就是这个

调用过程:

用户请求 —> Apache 服务器 —> 调用 mod_php5 模块处理请求 —> 返回请求结果给 Apache —> Apache 返回结果给用户

图解:

ISAPI(Internet Server Application Program Interface)

简介:

在 PHP5.3 以后,PHP 不再有 ISAPI 模式,安装后也不再有 php5isapi.dll 这个文件。要在 IIS6 上使用高版本 PHP,必须安装 FastCGI 扩展,然后使 IIS6 支持 FastCGI。故此处不做过多介绍

图解: