在各种环境上配置过无数次运行环境之后,我们好像还是搞不清PHP到底是怎么被执行的以及在不同的环境中有什么区别,曾经还和一个架构师因为PHP到底有几种运行模式这个事儿理论过,所以今天花一点时间研究一下。
一. 常见的运行模式
在Apache中,PHP通常有以下3种运行模式:
- CGI
- apache2handler(mod_php)
- FastCGI
在IIS中,PHP通常有以下3种运行模式:
- CGI
- ISAPI
- FastCGI
在Nginx中,默认支持的模式只有 FastCGI。
二. 那么问题来了,到底什么是CGI,什么是FastCGI还有ISAPI
CGI
CGI 全称 Common Gateway Interface, 中文是“通用网关接口”,在维基百科上的说明是这样的:
CGI描述了客户端和服务器程序之间传输数据的一种标准。
但实际上这个说明是有明显歧义的,不利于我们理解CGI这个概念,百度百科上的说明是这样的:
CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。
简单的说,CGI规定了Web服务器程序如何调用PHP(或者其他程序),以及PHP该如何响应服务器程序的调用。
FastCGI
解释FastCGI之前必须要了解CGI的运行原理,Web服务器每次接收到CGI请求都要去创建(fork)一个PHP进程,然后执行程序,返回结果,再销毁进程,网上把这种执行模式叫做fork-and-execute。
而这种执行模式的问题在于,每次都要消耗大量的系统资源去创建和销毁PHP进程。所以就出现了FastCGI标准,FastCGI通常是一个进程管理器,他会初始化很多PHP进程,如果服务器发来CGI请求,进程管理器会把这个请求分配到其中一个PHP进程,返回结果后并不销毁进程,而是等待下一次分配请求。
我们常用的PHP-FPM实际上是一个实现了FastCGI标准的进程管理器,另外还有PHP-CGI也是。
Apache2handler
这是我们在Linux下部署环境常用的一种模式,也是Apache默认的模式,Apache通过mod_php5模块来调用PHP。
Apache中还有一个模式的概念,一般指的是prefork,worker,event,不过这和我们这里要研究的PHP运行模式没有太大关系,其实PHP-FPM也有几种不同的工作模式,这样说下去天要黑了。
ISAPI
好吧,其实我从来没接触过ISAPI,这是微软设计的一套CGI标准,只适用于Windows平台。
在PHP源码中的sapi目录还有cli,phpdbg,embed,litespeed等执行模式,不过都是web之外的东西。关于这些不同的运行模式的区别与优劣,其实是个很深奥的学问,待我研究明白再和大家娓娓道来。