先说下我最近看到的一篇文章,哈哈哈,特别好玩。

一步步教你编写不可维护的 PHP 代码

之前一直知道 PHP 在 CGI 模式下运行。命令行下在 CLI 模式下运行。

但是 FPM 和 nginx 配置 FastCGI 他们具体是什么关系?还真的不太明白,今天来说下他们的关系。

CGI 是干什么的?

  这得和我们的一个请求的正常流程来看。

  当一个请求来时,由 WebServer(nginx/Apache) 来对请求进行分发。

  如果请求的是 index.html 那么服务器回去寻找对应的文件并返回该静态资源。

  当然,这只是静态资源。

  当请求内容为 index.php 时,WebServer 发现这并不是一个静态文件,之后会根据配置来寻找 PHP 解析器来处理这个请求。

  找到 PHP 解析器之后,怎么传递数据呢?必须使用大家都明白的的一个东西吧,就像 英语 -> 英语交流, 汉语->汉语交流,英语->汉语->无法交流(不明白对方说的什么);

  CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中所有的数据是怎么来的?

  

  所以,当收到 /index.php 这个请求后

    1:会启动CGI程序【PHP解释器】。

    2:之后CGI会启动一个进程解析 php.ini ,初始环境,处理请求。

    3:在已规定规定好的CGI格式返回给 WebServer 。

    4:销毁这个进程。

    5:WebServer 在把结果返回给浏览器。

  

  CGI是个协议,是为了保证web server传递过来的数据是标准格式的

Fastcgi 是干什么的?

  这里就需要说一下 PHP-CGI 的缺点了,通过上面关于CGI的描述,发现 CGI 的特点

    请求->启动一个进程处理->处理完销毁这个进程

  CGI在请求时反复加载,这也正是 CGI 性能低下的主要原因,正是应为这样,才有了Fastcgi。

  

  定义:WEB服务器与处理程序之间通信的一种协议,是CGI的改进方案。

  

  不同【也可以说是特点吧】: 

    1:fastcgi 是一个常驻型的CGI,可以一直运行,在请求时,不会fock一个新的进程来处理。

    2:CGI 解释器进程在内存中保持,以此来获得更好的性能。

   

  Fastcgi 工作流程:

    1:在Web Server启动时同时载入 Fastcgi 进程管理器

    2:Fastcgi进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的连接

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

    4:FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。

    5:  FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。在CGI模式中,php-cgi在此便退出了。

  简单来说:

    比如我家要装修,装修材料不知道什么时候来。

    CGI是:

      装修材料来->雇工人->干活->解雇工人。

      费时费力。

    Fastcgi:

      先雇几个工人等着->不管什么时候材料来->干活->继续等着

  总结:Fastcgi就是用来提高CGI程序性能的。

PHP-FPM 是干什么的? 

  Fastcgi 比 CGI 好用,我们为什么不用,于是 被PHP官方收了。

  大家都知道,PHP解释器是PHP-CGI,但是PHP-CGI是个CGI程序,自己本身只能解析请求,并不能对进程进行管理。

  所以就出现了一些可以管理 PHP-CGI 进程的程序。

  PHP-FPM 也就是这样。

  总结:php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的

总结:

  fastcgi是一个协议,php-fpm实现了这个协议。

  php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是).

  

参考:

  搞不清FastCgi与PHP-fpm之间是个什么样的关系

  

《PHP - CGI/Fastcgi/PHP-FPM》的更多相关文章

  1. 《PHP内核剖析 - FPM》

    一:概述 - FPM 定义 -  FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器. -  FastCGI -  Web服务器(如:Nginx. ...

  2. Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  3. [转] Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  4. 转:nginx+CGI/FASTCGI

    简介版: 1.fastcgi与cgi区别:fastcgi通过线程来响应请求,而cgi对每个请求生成一个进程. 2.典型nginx数据传输过程:user->nginx->本地socket(请 ...

  5. cgi fastcgi php-cgi php-fpm

      参考: 摘至:http://www.cnblogs.com/thinksasa/p/4497567.html 详说fastcgi,php-fpm的区别:http://segmentfault.co ...

  6. 【转】Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  7. 《Linux多线程服务端编程》笔记——多线程服务器的适用场合

    如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...

  8. 《PHP内核探索系列文章》系列分享专栏

    <PHP内核探索系列文章>已整理成PDF文档,点击可直接下载至本地查阅 简介 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识 ...

  9. 《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境

    <Linux就该这么学>培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片. 文章主要内容: 源码包程序 LNMP动态网站架构 配置Mysql服务 配置 ...

随机推荐

  1. Mssql Server2005中更改sa的用户名的多种方法

    mssql安装上去时默认就是sa用户,大多数用户都会一直使用sa这个用户,这样数据库就存在很大的安全问题了,如果我们能把sa用户名修改,这样安全级别又高了一层哦,下面我们来看修改sa用户名的办法.   ...

  2. python 验证码识别示例(二) 复杂验证码识别

     在这篇博文中手把手教你如何去分割验证,然后进行识别. 一:下载验证码 验证码分析,图片上有折线,验证码有数字,有英文字母大小写,分类的时候需要更多的样本,验证码的字母是彩色的,图片上有雪花等噪点,因 ...

  3. 修改Egret引擎代码的方法

    某些情况下,我们需要修改Egret引擎的源码,我们可以在源码目录(一般如下:xxx\Egret\engine\x.x.x\src\egret)下直接修改ts代码. 在对应的项目下打开CMD命令行,输入 ...

  4. 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应

    没接触过flexible的建议先看看大漠的这篇文章这样你才会知道长度为什么用rem,而字体要用px 安装flexible npm install lib-flexible --save 引入flexi ...

  5. 大数据:Parquet文件存储格式

    一.Parquet的组成 Parquet仅仅是一种存储格式,它是语言.平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎 ...

  6. NaviSoft31.源码开发完成

    NaviSoft是作者一人开发完成,从之前的1.0版本,到现在的3.1版本.历经2年时间,开发完成 下面是NaviSoft的源码结构 加QQ群了解更多信息

  7. SFTP工具类

    1.SFTP搭建方法: 地址: http://www.jb51.net/article/101405.htm https://blog.csdn.net/helloloser/article/deta ...

  8. php utf8编码字符串的截取

    function sub_str($str, $length = 0, $append = true) { $str = trim($str); $strlength = strlen($str); ...

  9. tensorflow冻结变量方法(tensorflow freeze variable)

    最近由于项目需要,要对tensorflow构造的模型中部分变量冻结,然后继续训练,因此研究了一下tf中冻结变量的方法,目前找到三种,各有优缺点,记录如下: 1.名词解释 冻结变量,指的是在训练模型时, ...

  10. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】搭建HAWQ数据仓库02 ——使用ambari-server安装HDP

    本文记录使用ambari-server安装HDP的过程,对比于使用cloudera-manager安装CDH,不得不说ambari的易用性差的比较多~_~,需要用户介入的过程较多,或者说可定制性更高. ...