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

一、抛个砖

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三者之间的关系: 

2724f62d397c571216b9deac3f6f7d56.png

从上面图中,我们看出了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会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。 

73f4e1d428059220abd731ebd313d7d5.png

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

9f8bc139a1710ca07e96d9c671534019.png

当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服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。 

629ec80bd9759c668f9b6333c8c6b2df.png

(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配置。

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

923b0d8a31676cf6d8a6622c0586dbb4.png

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

参考:

      https://segmentfault.com/a/1190000010968145

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

287882a6e583c80f7765002ad2830c2e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android群英传神兵利器pdf,《Android群英传:神兵利器》勘误

1勘误一晃,我的新书《Android群英传:神兵利器》上市好多天了,有不少朋友已经拿到书了。本来以为,这次我看了不下十遍,再加上编辑们的校对,应该不会有很多勘误了吧~ 可事实证明,我还是太年轻啊!大…

datatype未定义是什么意思_TypeError:无法读取未定义的属性'then'

loginService.islogged()上面的函数返回一个像“失败”的字符串 . 但是,当我尝试运行然后对它运行时,它将返回错误TypeError: Cannot read property then of undefined并且光标在 connected 之后和 .then 之前指示 .以下是完整功能:var conne…

python运行命令_对python中执行DOS命令的3种方法总结

1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息。 import os os.system("ls") 2. 使用Popen模块产生新的process 现在大部分人都喜欢使用Popen。Popen方法不会打印出cmd在linux上执行的信息。的确,Popen非常强大&a…

android studio 不生成buildconfig,Android Studio Update 0.4.0找不到buildConfig()

将Android Studio升级到版本0.4.0后,出现了一个新错误:我通过gradle-wrapper.properties升级到gradle 1.9distributionUrlhttp\://services.gradle.org/distributions/gradle-1.9-all.zip并升级了build.gradle中的gradle版本dependencies {classpath com…

谭民机器人_机器人视觉伺服研究进展-中科院自动化所-谭民.

文章编号:100220446(2004 0320277206机器人视觉伺服研究进展Ξ王麟琨,徐德,谭民(中国科学院自动化研究所复杂系统与智能科学实验室,北京100080摘要:,针对当前机器人视觉伺服所面临的主要问题, .关键词:机器人;视觉伺服;综述中图分类号::Survey of R esearch on Robotic Visual …

mysql 按月和年累加_广西柳州市市场监管局公布市2020年11月(第一批)电梯按需维保试点名单...

中国质量新闻网讯 根据《柳州市改进电梯维护保养模式试点工作方案》,近日,广西柳州市市场监管局公布柳州市首批按需维保试点电梯名单,冠亚蓝湾国际小区和南庆安置小区共46台电梯成为首批试点电梯,标志着柳州市全面启动了按需维保改…

python默认深拷贝_Python 深拷贝与浅拷贝

首先分享Python里面的数据类型1、不可变类型:Number(数字)、String(字符串)、Tuple(元组)。不可变数据类型在第一次声明赋值的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内…

上传 mp4 格式判断_视频如何转换成通用的MP4格式?按下这个键,10秒就能搞定...

我们在网上下载视频的时候,有很多的视频都是无法播放的,或者是需要特定的播放器才可以播放。其实,只要把这些视频的格式转换成通用的MP4格式即可。如果你还不知道怎么转换视频格式,下面就教大家两个小方法,百试百灵。一…

android不能在主线程,安卓开发:主线程真的不能做UI操作吗?这一点很多程序员都没想到...

只要参与过安卓项目开发一两年的朋友们应该清楚,为了避免UI渲染出现异常安卓框架限制UI操作只能在主线程中进行,如果贸然在子线程做了UI操作结果会怎样?我们随便写下了如下测试代码。不出意外的话,代码执行报错抛出了名为CalledFr…

c++注释快捷键_Jupyter Notebook amp; Lab快捷键大全

Jupyter有两种模式,命令模式和编辑模式,分别有不同的快捷键。编辑模式(按键 Enter 切换):可以往单元中键入代码或文本,此时单元格被蓝色的框线包围,且命令模式下的快捷键不生效; 命令模式 (按键 Esc 开启)&…

多核cpu应用场景_CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅

现代生活里,不论是工作还是生活,多开软件和处理事务可以说都是家常便饭的事情。一边玩着醉心已久的游戏,一边解压着新的电影和游戏;为了查询资料,一不小心打开了数十个网页;复杂繁重的工作铸就了动辄上百兆…

swot分析法案例_项目型销售案例剖析的五大步骤

我们的案例分析方式是根据哈佛大学与中欧国际工商学院的案例分析方法来总结出我们的模式的。这种分析方法包括两种互相关联和依赖的方面。第一方面,就是要对所指定的将供集体讨论的案例,做出深刻而有意义的分析,包括找出案例所描述的情景中存…

autojs 云控_autojs websocket 核心示例代码,云控技术

//初始化方法function recordInit(scriptName){//let ipInfoJson getIP()// let ip ipInfoJson.cip// let location ipInfoJson.cnamelet deviceIMEI ,deviceBrand,deviceModel,AndroidVer,deviceWH,deviceBoard,deviceMac,AndroidIdtry {deviceBrand device.brand;//制造…

定时器和promise_从Promise链理解EventLoop

面试题new Promise(resolve > { setTimeout(()>{ console.log(666); new Promise(resolve > { resolve(); }) .then(() > {console.log(777);}) }) resolve(); }) .then(() > { new Promise(resolve > { resolve(); …

ugui源码_UGUI整体解决方案基础篇(Unity 2019)

课程介绍:本课程是UGUI系列课程的第一篇:基础篇主要是讲解UGUI的基础组件及接口的使用方法,目前UGUI是unity最常用的UI系统,这部分基础只是是每个同学都应该掌握的,这里我就是简单的讲解了用法,大家对UGUI熟…

android 实例源码解释,Android Handler 原理分析及实例代码

Android Handler 原理分析Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题今天就为大家详细剖析下Handler的原理Handler使用的原因1.多线程更新Ui会导致UI界面错乱2.如果加锁会导致性能下降3.只在主线程去更新UI,轮询处理Handl…

amd cpu排行_最新intel和amd处理器性能排行cpu天梯图2019

现在市面上cpu厂家有很多,比如常见的intel系列的、amd系列CPU,cpu对电脑起着至关重要的作用,所以我们需要知道cpu性能的好坏,为此小编这就给大家带来最新intel和amd处理器性能排行对比天梯图,大家可以了解一下吧。inte…

python中的对象列表_Python内建的对象列表

Python内建的对象列表刚写Python肯定会遇到这样的情况,想写些什么,但又不知从何写起...在我看来问题在于我们不知道有什么东东可以拿来玩,这里列出Python的内建对象,稍微归类了一下,多看几遍代码自然笔上生花&#xff…

电脑会显示android,怎么在电脑上显示、操作安卓手机

想要在电脑上显示、操作安卓手机,该怎么办,那么怎么在电脑上显示、操作安卓手机的呢?下面是学习啦小编收集整理的怎么在电脑上显示、操作安卓手机,希望对大家有帮助~~在电脑上显示、操作安卓手机的方法工具/原料windows操作系统安卓手机电脑…

git version是什么软件_Deepin 15.11 安装 ZoneMinder 视频监控软件

Zoneminder是一款开源的视频监控软件,可以很方便的连接ip摄像头。因计划将家中的监控摄像头引入NAS,在一台deepin系统的笔记本是先进行了测试。UBUNTU和debian系统都是很容易安装这个软件的。未来在NAS上用docker启动一个专门的zoneminder,do…