一、抛个砖

1、Web Server传递数据的方法

正式说CGI之前,先来了解一下Web Server传递数据的另外一种方法:PHP Module加载方式。相信都会想起Apache吧,初学php时,在windows上安装完php和Apache之后,为了让Apache能够解析php代码,我们会在Apache的配置文件(httpd.conf)中添加如下配置:

#添加下边两行LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修改如下内容    DirectoryIndex index.php index.html

当在linux环境下源码安装时,大致是这样:

# ./configure --with-mysql=/usr/local --with-apache=/usr/local/apache --enable-track-vars

其实原理都是,用LoadModule来加载php5_module,就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。

那么,php5_module是如何将数据传给php的解析器来解析php代码的呢?   答案是:sapi

用一张图来看apache、php、sapi三者之间的关系:

从上面图中,我们看出了sapi就是这样的一个中间过程,sapi提供了一个和外部通信的接口,使得PHP可以和其他应用进行交互数据(apache,nginx等)。php默认提供了很多种sapi,常见的提供给apache和nginx的php5_module、CGI、FastCGI,给IIS的ISAPI,以及Shell的CLI。(httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程池)

所以,以上的apache调用php执行的过程如下:

apache -> httpd -> php5_module -> sapi -> php

这种模式将php模块安装到apache中,每一次apache请求,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。

在上图中,我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。而且,把php当做一个模块加载到apache中,出问题时很难定位是php的问题还是apache的问题。

2、引出概念

在整个网站架构中,Web Server(如Apache、Nginx)只是内容的分发者。举个栗子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。

如果请求的是 index.php,根据配置文件,Web Server知道这个不是静态文件,需要去找 PHP 解析器来处理,那么他会把这个请求简单处理,然后交给PHP解析器。

当Web Server收到index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,会好理解很多。

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。

FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。

PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。

PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。

(Web Server 一般指Apache、Nginx、IIS、Tomcat等服务器,Web Application 一般指PHP、Java、Asp.net等应用程序)

二、概念

1、CGI

CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。

WEB服务器会传哪些数据给PHP解析器呢?URL、查询字符串、POST数据、HTTP header都会有。所以,CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议。也就是说,CGI就是专门用来和 web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(如php-cgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句,返回给web服服务器,WEB服务器再返回给客户端,这就是普通cgi的工作原理。(cgi程序,你就可以理解成遵循cgi协议编写的程序)

优点:

CGI的好处就是完全独立于任何服务器,仅仅是做为中间分子。提供接口给web服务器和web应用(如提nginx和php)。他们通过cgi搭线来完成数据传递。这样做的好处了尽量减少2个的关联,使他们2变得更独立。

缺点:

但是CGI有个难受的地方,就是每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

2、FastCGI

从根本上来说,FastCGI是用来提高CGI程序性能的。类似于CGI,FastCGI也可以说是一种协议。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。

FastCGI是和语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中,并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中,并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

举例:

当web server收到/index.php请求,看一下CGI程序和FastCGI程序分别是怎么处理的:

CGI:当收到web server请求后,会启动对应的CGI程序,这里就是PHP的解析器(php-cgi)。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定的CGI规定的格式返回处理后的结果,退出进程。(CGI每次接收到请求都会执行这些步骤)

FastCGI:首先,FastCGI程序会先启动一个master,解析配置环境,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源,这就是fastcgi对进程的管理。(CGI程序和FastCGI程序,可以理解成遵循CGI协议和FastCGI协议编写的程序)

FastCGI的工作原理:

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

(1)Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)

(2)FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的连接。

(3)当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

(4)FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。

CGI与FastCGI比较:

(1)对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重新初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

(2)由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

3、PHP-FPM

首先要说的是:fastcgi是一个协议,php-fpm实现了这个协议。

大家都知道,PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理,所以就出现了一些能够调度php-cgi进程的程序,php-fpm就是这样的一个东西。它克服了php-cgi变更php.ini配置后,需重启php-cgi才能让新的php-ini生效,不可以平滑重启,直接杀死php-cgi进程,php就不能运行了的问题。修改php.ini之后,php-cgi进程的确没办法平滑重启的。php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

php-fpm提供了更好的php进程管理方式,可以有效的控制内存和进程,可以平滑重载php配置。

总结一下这个升级的过程:

如果要搭建一个高性能的PHP WEB服务器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了。

参考:

https://segmentfault.com/a/1190000010968145

https://www.awaimai.com/371.html

cgi web 调用多次启动_全面了解CGI、FastCGI、PHPFPM相关推荐

  1. cgi web 调用多次启动_简单说明CGI和动态请求是什么

    1. CGI是什么 CGI是common gateway interface的缩写,大家都译作通用网关接口,但很不幸,我们无法见名知意. 我们知道,web服务器所处理的内容都是静态的,要想处理动态内容 ...

  2. cgi web 调用多次启动_CGI、FastCGI和PHPFPM有什么关系呢?

    文章来自:php自学中心网站 链接:http://www.startphp.cn/front/php/0108111.html 作者:磊丰 商务合作:请加微信(QQ):2230304070 文章正文 ...

  3. .net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动

    上篇讲到.net core web app是如何启动并接受请求的,下面接着探索kestrel server是如何完成此任务的. 1.kestrel server的入口KestrelServer.Sta ...

  4. .net core 源码解析-web app是如何启动并接收处理请求

    最近.net core 1.1也发布了,蹒跚学步的小孩又长高了一些,园子里大家也都非常积极的在学习,闲来无事,扒拔源码,涨涨见识. 先来见识一下web站点是如何启动的,如何接受请求,.net core ...

  5. 重新学习Spring一--Spring在web项目中的启动过程

    1 Spring 在web项目中的启动过程 Spring简介 Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系,实现高内聚.低耦合.(高内聚:相关性很强的代码组成,既单一责任原则:低耦 ...

  6. Web前端 HTML 优化启动性能

    Web前端 HTML 优化启动性能 一个在软件应用开发中经常被忽视的方面-即便在那些专注于性能优化的软件中-就是启动时的表现.你的应用需要花费多长时间启动?当应用加载时是否会卡住用户的设备或浏览器?这 ...

  7. tomcat start 无法启动_解密Springboot内嵌Tomcat

    Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...

  8. 在idea使用maven工程建立web项目时,启动Tomcat访问不到项目首页。

    在idea使用maven工程建立web项目时,启动Tomcat访问不到项目首页,输入URL:http://localhost:8080/时一片空白也不报错 ,按下面步骤检查: 1.看下这几个地方是否配 ...

  9. VC6.0制作OCX并web调用 .

    1.打开VC6.0,新建工程,选择:MFC ActiveX ControlWizard,后面步骤默认即可: 2.在ClassView上,可以看到主要有**App\**Ctrl\**ProgPage几个 ...

最新文章

  1. React Native之ViewPagerAndroid跳转页面问题
  2. 限制edit只能输入数字
  3. php第五章 补充案例,第5章 多线程 - 补充案例
  4. 报名 | 想在硅谷近距离接触蚂蚁金服的CTO和一众技术高管?这个机会一定不能错过!...
  5. vscode python单步调试_调试期间VSCode python“未验证断点”?
  6. Android working with volley
  7. JAVA学习之类与对象例题分享(两点确定直线并进行相关操作)
  8. Java高阶入门N篇
  9. 面经——2022届CVTE提前批
  10. 匆忙赶路的时候别忘了适时停下来回头看看
  11. IDEA中将WEB-INF\lib下的Jar包添加到项目中
  12. 全球及中国卫星产业应用建设布局及投资机会分析报告2022-2028年版
  13. 周奕与共享软件(转)
  14. Apache commons digester简介说明
  15. 毫米波雷达,超声波雷达,激光雷达,摄像雷达比较
  16. linux regulator接口驱动demo
  17. 台式计算机中的CPU指的是,电脑硬件认识之什么是电脑的CPU(cpu详细介绍)
  18. C++——递归之数字组合
  19. 打开cad图纸计算机打不开,电脑上CAD软件为何打不开?打开电脑CAD软件方法!
  20. [蓝桥杯]连号区间数[题目详解]

热门文章

  1. Vue全家桶 之 Vue基础
  2. 轻松解决Android gradle太慢问题
  3. java 内省学习笔记
  4. oracle检查外键依赖,Oracle中检查外键是否有索引的SQL脚本分享
  5. java 异常补偿解决_第三方接口调用异常补偿机制实现实例记录
  6. 电子技术基础数字部分第六版_大部分数字图书馆技术特点与应用分析
  7. list按照某个字段排序_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合
  8. c语言程序设计的日志,C语言程序设计教学日志.docx
  9. qt窗口左上角坐标变动函数使用中的误区
  10. BugkuCTF-MISC题Pokergame