设为首页 收藏本站
开启辅助访问 快捷导航
菜单
猿人部落 主页 资讯 查看内容

CGI、FastCGI和PHP

2019-7-23 03:41 发布者: _Ammmmmm 评论 0 查看 1231
目次底子Module体式格局 CGIFastCGI先容FastCGI简朴先容FastCGI的任务 道理 PHP-FPM先容总结参考质料 在 搭建 LAMP/LNMP 效劳 器时,会常常遇到 PHP-FPM、FastCGI和 CGI 这几 个概念。假如对于 它们一知半解 ,很难搭建出高功

目次

  • 底子
  • Module体式格局
  • CGI
  • FastCGI先容
    • FastCGI简朴先容
    • FastCGI的任务 道理
  • PHP-FPM先容
  • 总结
  • 参考质料

在 搭建 LAMP/LNMP 效劳 器时,会常常遇到 PHP-FPM、FastCGI和 CGI 这几 个概念。假如对于 它们一知半解 ,很难搭建出高功用 的效劳 器。接上去 我们 就以图形体式格局 ,标明 这些概念之间的干系 。

底子

在 整个网站架构中,Web Server(如Apache)只是内容的分发者。举个栗子,假如客户端央求 的是 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 在 服从 上做了一些优化。十分 ,SCGI 协议与 FastCGI 类似。
  • PHP-CGI:是 PHP (Web Application)对于 Web Server 供应 的 CGI 协议的接口步调。
  • PHP-FPM:是 PHP(Web Application)对于 Web Server 供应 的 FastCGI 协议的接口步调,额外 还供应 了绝对于 智能一些任务管理 。

WEB 中,

  • Web Server 一样寻常 指Apache、Nginx、IIS、Lighttpd、Tomcat等效劳 器,
  • Web Application 一样寻常 指PHP、Java、Asp.net等使用 步调。

Module体式格局

在 相识 CGI 畴前 ,我们 先相识一下Web server 通报数据的别的 一种办法 :PHP Module加载体式格局 。以 Apache 为例,在 PHP Module体式格局 中,是没有 是在 Apache 的设置文件 httpd.conf 中加上如许几 句:

# 参加如下
2句LoadModule php5_module D:/php/php5apache2_2.dllAddType application/x-httpd-php .php# 修正
如下内容    DirectoryIndex index.php index.html

下面 是 Windows 下装置 php和 apache环境先手 动设置,在 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供应 了一个和 外部 通讯的接口,有点类似于socket,使得 PHP可以和 别的 使用 举行交互数据(apache,nginx等)。php默认 供应 了很多种SAPI,稀有 的供应 给apache和 nginx的php5_module、CGI、FastCGI,给IIS的ISAPI,和 Shell的CLI。

以是,以上的apache调用php实验的进程 如下:

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

好了。apache与php经过 php5_module的体式格局 就搞清晰了吧!

这种形式 将php模块装置 到apache中,以是每 一次apache竣事央求 ,城市 发作 一条进程,这个进程就完备的包罗php的各类 运算策画 等使用。

在 上图中,我们 很清晰的可以看到,apache每 吸取一个央求 ,城市 发作 一个进程来连接 php经过 sapi来完成 央求 ,难以想象 ,假如一旦用户过多,并发数过多,效劳 器就会蒙受没有 住了。

而且 ,把mod_php编进apache时,出标题时很难定位是php的标题还是apache的标题。

CGI

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

WEB效劳 器会传哪些数据给PHP剖析器呢?URL、查询字符串、POST数据、HTTP header城市 有。以是,CGI就是规则 要传哪些数据,以什么样的格局 通报给前方 处理处分 这个央求 的协议。过细想一想 ,你在 PHP代码中使用的用户从那里来的。

也就是说,CGI就是专门用来和 web 效劳 器打交道的。web效劳 器收到用户央求 ,就会把央求 提交给cgi步调(如php-cgi),cgi步调根据 央求 提交的参数作应处理处分 (剖析php),然后 输入 标准的html语句,前去 给web服效劳 器,WEB效劳 器再前去 给客户端,这就是平凡cgi的任务 道理 。

CGI的长处就是彻底 独立于任何效劳 器,仅仅是做为中央分子 。供应 接口给apache和 php。他们经过 cgi搭线来完成 数据通报。如许做的长处了只管淘汰2个的接洽干系 ,使他们2变得 更独立。

但是CGI有个蛋疼的中央 ,就是每 一次web央求 城市 有启动和 参加 进程 ,也就是最为人诟病的fork-and-execute形式 ,如许一在 年夜 范畴 并发下,就逝世 翘翘了。

FastCGI先容

FastCGI简朴先容

从根本 上来 说,FastCGI是用来提高 CGI步调功用 的。类似于CGI,FastCGI也可以 说是一种协议

FastCGI像是一个常驻(long-live)型的CGI,它可以不停实验着,只要 激活后,没有 会每 次都要泯灭工夫 去fork一次。它还支持 散布 式的运算, 即 FastCGI 步调可以在 网站效劳 器以外的主机上实验,而且继承来自别的网站效劳 器来的央求 。

FastCGI是言语 无关 的、可伸缩架构的CGI开放扩展,其重要活动是将CGI标明 器进程对于 峙 在 内存中,并因而 失掉 较高的功用 。尽人皆知 ,CGI标明 器的重复 加载是CGI功用 低下的重要缘故原由,假如CGI标明 器对于 峙 在 内存中,并继承FastCGI进程管理 器调理,则可以供应 精良的功用 、伸缩性、Fail- Over个性 等等。

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在 此便参加 了。

FastCGI与CGI个性 :

  1. 关于 CGI来说,每 个 Web央求 PHP都必需 重新 剖析php.ini、重新 载入全副 扩展,并重新 初始化全副 数据结构。而使用FastCGI,全副 这些都只在 进程启动时发作 一次。一个额外 的长处是,一连数据库连接 (Persistent database connection)可以任务 。
  2. 由于FastCGI是多进程,以是比CGI多线程斲丧更多的效劳 器内存,php-cgi标明 器每 进程斲丧7至25兆内存,将这个数字乘以50大概 100就是很年夜 的内存数。

PHP-FPM先容

要相识PHP-FPM,就得 先说说PHP-CGI。

PHP-CGI就是PHP完成 的自带的FastCGI管理 器。 固然是php官方出品,但是这丫的却一点也没有 给力,功用 太差,而且 也很贫困没有 兽性 化,重要体现在 :

  1. php-cgi变更php.ini设置后,需重启php-cgi才气让新的php-ini收效,没有 可以平滑 重启。
  2. 直接杀逝世 php-cgi进程,php就没有 克没有 及 运行 了。

下面 2个标题,不停让很多人病垢了很久,以是很多人不停还是在 用 Module 体式格局 。 直到 2004年一个叫 Andrei Nigmatulin的屌丝创造 了PHP-FPM ,这神器的出现 就彻底冲破了这种局面 ,这是一个PHP公用 的 fastcgi 管理 器,它很爽的降服了下面 2个标题,而且 ,还体现在 别的 方面更体现单薄 。

也就是说,PHP-FPM 是关于 FastCGI 协议的具体完成 ,他担当 管理 一个进程池,来处理处分 来自Web效劳 器的央求 。现在,PHP5.3版本之后,PHP-FPM是内置于PHP的

由于PHP-CGI只是个CGI步调,他自己自己只能剖析央求 ,前去 效果,没有 会进程管理 。以是就出现 了一些可以大概调理 php-cgi 进程的步调,好比说由lighthttpd别离 出来的spawn-fcgi。十分 ,PHP-FPM也是用于调理管理 PHP剖析器php-cgi的管理 步调。

PHP-FPM经过 天生新的子进程可以完成 php.ini修正 后的平滑 重启。

总结

着末 ,我们 来总结一下,这些技能颠末没有 断的晋级 ,可以管理什么标题(没有 然也没有 会晋级 嘛)。

以是,假如要搭建一个高功用 的PHP WEB效劳 器,现在最佳的体式格局 是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)体式格局 了,没有 要再使用 Module加载大概 者 CGI 体式格局 啦:)

本文章图片用Visio制造 ,源文件:php-fpm

参考质料

  1. 概念相识:CGI,FastCGI,PHP-CGI与PHP-FPM
  2. php中fastcgi和 php-fpm是什么工具
  3. 叨教CGI、PHP-CGI、PHP-FPM之间是什么干系 ?
  4. FastCGI 进程管理 器(FPM)

来源:https://www.jianshu.com/p/931065da370e
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

路过

雷人

握手

鲜花

鸡蛋
收藏 邀请

相关阅读

一周热门

头条攻略!

日排行榜

相关分类