说说PHP在Web上的运行模式

在各种环境上配置过无数次运行环境之后,我们好像还是搞不清PHP到底是怎么被执行的以及在不同的环境中有什么区别,曾经还和一个架构师因为PHP到底有几种运行模式这个事儿理论过,所以今天花一点时间研究一下。

一. 常见的运行模式

在Apache中,PHP通常有以下3种运行模式:

  1. CGI
  2. apache2handler(mod_php)
  3. FastCGI

在IIS中,PHP通常有以下3种运行模式:

  1. CGI
  2. ISAPI
  3. 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目录还有cliphpdbgembed,litespeed等执行模式,不过都是web之外的东西。关于这些不同的运行模式的区别与优劣,其实是个很深奥的学问,待我研究明白再和大家娓娓道来。

参考:http://segmentfault.com/q/1010000000256516