PHP SAPI 与运行模式
在 PHP 源码中,有一个目录叫 sapi。sapi 在 PHP 中的作用,类似一个消息的“传递者”,(PHP-FPM中的fpm,其作用就是接受 web 容器通过 fastcgi 协议封装好的数据,交给PHP解释器执行;除了fpm,最常见的sapi应该是用于 Apache 的 mod_php,这个sapi用于 php 和 apache 之间的数据交换。)
php-cgi 也是一个 sapi。在远古的时候,web 应用的运行方式很简单,web 容器接收到 http 数据包后,拿到用户请求的文件(cgi 脚本),并 fork 出一个子进程(解释器)去执行这个文件,然后拿到执行结果,直接返回给用户,同时这个解释器子进程也就结束了。基于 bash、perl 等语言的 web 应用多半都是以这种方式来执行,这种执行方式一般就被称为cgi,在安装 Apache 的时候默认有一个 cgi-bin 目录,最早就是放置这些 cgi 脚本用的。
但 cgi 模式有个致命的缺点,众所周知,进程的创建和调度都是有一定消耗的,而且进程的数量也不是无限的。所以,基于 cgi 模式运行的网站通常不能同时接受大量请求,否则每个请求生成一个子进程,就有可能把服务器挤爆。于是后来就有了 fastcgi,fastcgi 进程可以将自己一直运行在后台,并通过 fastcgi 协议接受数据包