对于一个web开发者来说,搭建web开发环境其实很简单,windows下直接用集成环境,linux下命令安装也非常方便,不管是LAMP/LNMP/LLMP网上环境搭建的资料更是成千上万,也正是因为如此方便,导致很多线上的web服务器是集成或复制命令进行运行环境搭建。
很多开发者都不曾了解过web服务器的配置细节及php执行模式,当web服务异常及性能低下的时候,无法快速定位及做出对应的调整。我也是这样的一位小白,开发了那么久,也并未曾好好的梳理过web运行环境及php之间的联系,所以仔细梳理了一次来补充这块知识的空白。


web服务器是什么?

WEB服务器是用于接收浏览端的http请求,进行服务响应处理,主流的有Apache/Nginx/Lighttpd/IIS/Tomcat/UWSGI(wsgi一种协议,是由Python实现Web服务器网关接口)

WEB服务器默认监听80端口,当有http请求进来的时候。如是静态资源(图片/html/css文件)会对url进行映射,返回服务器配置目录下对应路径的静态资源文件,找不到路径或文件则会返回404错误,如是动态资源(jsp/php/aspx/cgi后缀的文件)则会将转交由相应的解析引擎执行处理,最后返回解析引擎的处理结果。说白了web服务器就是对http协议进行解析响应并返回(图片/文件/html代码)的一个服务,注意如果返回数据浏览器无法识别就会按文本文件直接输出内容(如php文件未转php解析引擎处理由web服务器直接返回时,将会在浏览器页面显示php的源代码)

Web服务器工作原理详解(基础篇)_网络_青城山小和尚-CSDN博客
概述:Web服务器概念较为广泛,我们最常说的Web服务器指的是网站服务器,它是建立在Internet网络
扩展阅读
HTTP之Web服务器是如何进行工作的! - 肖申 - 博客园
Web服务器是如何进行工作的 文章摘自《HTTP权威指南》 1、 建立连接—接收一个客户端的连接,或者如果不希望与这个客户端建立连接,就将其关闭; 2、 接收请求—从网络中读取一条HTTP请求报文;
扩展阅读

在了解完web服务器后,咱再看看php是如何与web进行交互的,前面也提到web服务器会将php文件转php解析引擎处理,PHP提供了多种SAPI(Server Application Programming Interface)服务器应用程序编程接口,包含aolserver、apache、 apache2filter、apache2handler、 caudium、cgi (直到 PHP 5.3), cgi-fcgi、cli、 cli-server、 continuity、embed、fpm-fcgi、 isapi、litespeed、 milter、nsapi、 phttpd、pi3web、roxen、 thttpd、tux、webjames,目前 PHP 内置的很多 SAPI 实现都已不再维护或者有些非主流了


目前最让人熟知的有CGI模式、FastCgi模式、apache2handler(mod_php模块模式)、Cli模式、Isapi模式


CGI模式

全称为COMMON GATEWAY INTERFACE(公共网关接口),严格来讲CGI是一种协议,用于web服务器(Nginx\Apache\IIS)与外部应用程序的一个接口标准,在php问世之前更多是使用其它语言(C\perl\python\shell…)依据cgi协议编写程序实现动态网站,实际上是PHP通过CGI协议实现了与web服务器通信的php-cgi接口,所以称为PHP-CGI模式比较好理解。当web服务器接收一个http请求需要执行php代码时就会开启一个进程进行处理,完成之后就会关闭这个进程,有多少个http连接就会产生多个个cgi进程,cgi进程每一次都会fork-and-execute(解析php.ini配置、初始化执行环境、返回数据、关闭进程)也正因此cgi模式性能消耗非常大。

PHP的CGI实现 - luckc# - 博客园
FastCGI简介CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程
扩展阅读
动态web技术(二) --- CGI_PHP_zhang197093的博客-CSDN博客
本篇是系列文章中的第二篇,讲述大名鼎鼎的CGI技术。CGI全称为CommonGatewayInterPHP
扩展阅读
Apache指南:CGI动态页面 - 初日 - 博客园
概要相关模块相关指令mod_aliasmod_cgiAddHandlerOptionsScriptAliasCGI(公共网关接口[Common Gateway Interface])定义了网站服务器与
CGI扩展阅读
FastCGI模式

Long-Live CGI:常驻型通用网关接口,其实是一个php-cgi协议的升级版(同样可用各种开发语言实现),主要解决php-cgi的性能问题。fastcgi模式运行时会先fork一个master进程(解析配置文件、初始化执行环境)进行监听端口,然后再fork多个空闲的worker(具体数量根据实际需要配置),当有php处理请求时,master会分发给其中一个worker,然后立即接受下一个请求,当worker不够或过多,master会动态创建/回收worker,因为master减少了解析配置及初始化执行环境的步骤,所以会比cgi模式更节约资源,性能也更好。

fastcgi模式对于许多人来说更熟悉的应该是php-fpm,但除此之外还有mod_fcgid、mod_fastcgi,mod_proxy_fcgi(apache2.4起开始支持)

mod_fastcgi :是FastCGI.com的项目,使用的是FastCGI授权条款,目前已经不怎么用了,官方站点也访问不了,更多说明见:https://fastcgi-archives.github.io/mod_fastcgi.html,实现上是通过《管道文件》将php转给fast-cgi进程处理(多个进程fastcgi进程会共享着同一个管道文件),导致通讯错误的时候,根本不知道正在通讯的是哪一个fastcgi,于是也没有办法将这个有问题的进程杀死。

mod_fcgid:是Apache基金会负责的项目,使用的是Apache-2.0授权条款,通常会搭配bytecode/opcode cache使用(如APC、eAccelerator 或Xcache 等),实现上是使用《共享内存》解决mod_fastcgi出现的问题防止过度的创建fastcgi进程,无谓的消耗系统的资源。

PHP-FPM(PHP-FastCGI Process Manager):对FastCGI协议的实现,并提供了进程管理功能,作为一个第三方的fastcgi进程管理器,从5.3.3版本起php官方收录,更多资料可见官方百度百科

php-fpm支持static、ondemand、dynamic三种运行模式,默认为dynamic 。

  • static : 静态模式,启动时分配固定的worker进程。只需要考虑max_children的数量,数量取决于cpu的个数和应用的响应时间。
  • ondemand: 按需分配,启动时不分配任何进程,当收到用户请求时才启动进程。 master进程检查work进程的数量是否受限,是否有空闲的work进程,没有就新建work进程。在大流量的系统上master进程会变得繁忙,占用系统cpu资源,不适合大流量环境的部署。
  • dynamic: 动态模式,启动时分配固定的进程。伴随着请求数增加,在设定的浮动范围调整worker进程。

mod_fcgid、mod_fastcgi、php-fpm之间到底有什么区别呢?网上的资料真的少之又少,整理后总结如下:
mod_fastcgi、mod_fcgid、mod_proxy_fcgi也可以理解是apache对fast-cgi协议的进程管理器,是Apahce服务器中对fast-cgi模式实现的支持,
mod_fastcgi、mod_fcgid:在2004年之前的php5.2/apache2.2版本的配置文件里最为常见,mod_proxy_fcgi是apahce2.4新的实现方式
php-fpm:是一个实现fast-cgi协议的第三方进程管理器,因性能非常好从php5.3版本被php官方收录,此后每种web服务器apache、nginx(2004年第一版)都能直接使用php-fpm实现factcgi协议的php解析处理。


CGI 和 FastCGI 协议的运行原理 - itbsl - 博客园
讲述 CGI 和 FastCGI 协议的运行原理
扩展阅读
php的运行原理、cgi对比fastcgi以及php-cgi和php-fpm之间的联系区别 - 孙龙 - 博客园
CGI: CGI的英文是(COMMON GATEWAY INTERFACE)公共网关接口,它的作用就是帮助服务器与语言通信,这里就是nginx和php进行通信,因为nginx和php的语言不通,因此需
扩展阅读
深入了解SAPI - 小小聪的PHP - SegmentFault 思否
服务器应用程序编程接口,就是服务器与编程语言之间交互的接口。比如Linux命令行执行一段PHP代码,其实是Linux shell通过PHP SAPI传入一组参数,zend引擎执行后返回给shell。在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。
扩展阅读
apache2handler:Mod_php模块模式

Apache服务器是主要使用此方式的web服务器,PHP作为一个模块集成到web服务器进程中,php与apache是相互影响的,apache或php异常都会导致web服务进程中断,修改了php.ini的配置就要重启apache服务器。

Mod_php模式实际上是Apache在CGI协议的基础上进行的一种扩展,与上面CGI模式最大的不同是:cgi模块作为中间件进行php解析处理,而mod_php方式是在apache进程中进行php解析处理

mod_php方式最明显的是http.conf配置里面使用LoadModulephp5_module modules/libphp5.so加载php做为模块使用,而除了php5_module,还有cgi_module(cgi程序)、wsgi_module(python的wsgi)、mod_fastcgi(fastcgi)等类似的配置写法。

mod_fastcgi使用类似于mod_php模式的LoadModule fastcgi_module modules/mod_fastcgi.so配置写法开启fastcgi模块,但实际执行是通过中间件方式实现了php的fastcgi模式解析执行。php5_module与mod_fastcgi是会有所冲突的,当用mod_fastcgi的时候php5_module会失效(详见:https://my.oschina.net/u/1433006/blog/544524

mod_php和mod_fastcgi和php-fpm的介绍,对比和性能数据 - 一坪海岸线y - 博客园
1、php中fastcgi和php-fpm是什么东西 最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕
扩展阅读
什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI? - 52php - 博客园
什么是CGI CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用
扩展阅读
CLI模式

全称为Command Line Interface(命令行接口),用于在命令行里执行php文件如:php index.php,没经常用命令行的phper估计对CLI模式会比较莫生。CLI是从php4.3版本开始支持,更多的信息可以从官方了解

ISAPI模式

ISAPI(Internet Server Application Program Interface)是微软提供的一套面向 Internet 服务的 API 接口,工作原理和CGI大体上是相同的,都是通过交互式主页取得用户输入信息,然后交服务器后台处理。不同于CGI,在ISAPI下建立的应用程序是以动态连接库的形式存在;而CGI的应用程序一般都是可执行程序。

一个 ISAPI 的 DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个 DLL 里设置多个用户请求处理函数,此外,ISAPI 的 DLL 应用程序和 WEB 服务器处于同一个进程中,效率要显著高于 CGI。

由于开发ISAPI应用要用到微软的一套API,所以能用来开发ISAPI应用的语言不如CGI那么多。主要有VisualC++4.1以上版本,VisualBasic5.0、BorlandC++5.0也可以。而此模式也只能运行于 Windows 环境。

PHP 运行模式 - PHP 学习总结 - SegmentFault 思否
这里所说的 PHP 运行模式, 其实指的是 SAPI (Server Application Programming Interface,服务端应用编程端口 )。SAPI 为 PHP 提供了一个和外部通信的接口, PHP 就是通过这个接口来与其它的应用进行数据交互的。针对不同的应用场景, PHP 也提供了多种不同的 SAPI ,常见的有:apache、apache2filter、apache2handle...
扩展阅读
以上的所有记录都是基于对网上资料的整理,如有错误还望指正

其它参考:

https://blog.csdn.net/qq_21956483/article/details/80348751

https://blog.csdn.net/qq_21956483/article/details/80348316

https://www.cnblogs.com/mzhaox/p/11230923.html

https://www.cnblogs.com/52php/p/5668823.html

https://www.cnblogs.com/52php/p/5668824.html