《PHP - CGI/Fastcgi/PHP-FPM》
先说下我最近看到的一篇文章,哈哈哈,特别好玩。
之前一直知道 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也管理不了他(至少目前是).
参考:
《PHP - CGI/Fastcgi/PHP-FPM》的更多相关文章
- 《PHP内核剖析 - FPM》
一:概述 - FPM 定义 - FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器. - FastCGI - Web服务器(如:Nginx. ...
- Nginx + CGI/FastCGI + C/Cpp
接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...
- [转] Nginx + CGI/FastCGI + C/Cpp
接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...
- 转:nginx+CGI/FASTCGI
简介版: 1.fastcgi与cgi区别:fastcgi通过线程来响应请求,而cgi对每个请求生成一个进程. 2.典型nginx数据传输过程:user->nginx->本地socket(请 ...
- cgi fastcgi php-cgi php-fpm
参考: 摘至:http://www.cnblogs.com/thinksasa/p/4497567.html 详说fastcgi,php-fpm的区别:http://segmentfault.co ...
- 【转】Nginx + CGI/FastCGI + C/Cpp
接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...
- 《Linux多线程服务端编程》笔记——多线程服务器的适用场合
如果要在一台多核机器上提供一种服务或执行一个任务,可用的模式有 运行一个单线程的进程 运行一个多线程的进程 运行多个单线程的进程 运行多个多线程的进程 这些模式之间的比较已经是老生常谈,简单地总结 模 ...
- 《PHP内核探索系列文章》系列分享专栏
<PHP内核探索系列文章>已整理成PDF文档,点击可直接下载至本地查阅 简介 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识 ...
- 《Linux就该这么学》培训笔记_ch20使用LNMP架构部署动态网站环境
<Linux就该这么学>培训笔记_ch20使用LNMP架构部署动态网站环境 文章最后会post上书本的笔记照片. 文章主要内容: 源码包程序 LNMP动态网站架构 配置Mysql服务 配置 ...
随机推荐
- 用交叉验证改善模型的预测表现-着重k重交叉验证
机器学习技术在应用之前使用“训练+检验”的模式(通常被称作”交叉验证“). 预测模型为何无法保持稳定? 让我们通过以下几幅图来理解这个问题: 此处我们试图找到尺寸(size)和价格(price)的关系 ...
- 安装APK失败,错误代码:INSTALL_FAILED_INVALID_APK 解决方案
错误代码:installation failed with message failed to finalize session:INSTALL_FAILED_INVALID_APK 解决方法如下:
- Atitit uke公司简介与基本制度建设草案v11 r66 .docx
Atitit uke公司简介与基本制度建设草案v11 r66 .docx Uke org prj Author撰写人: 作者:: 绰号:老哇的爪子claw of Eagle 偶像破坏者Iconocl ...
- 记一次redis病毒分析笔记
起因 偶然间发现redis里有一个陌生key:tightsoft,它的值是:*/1 * * * * root curl -fsSL https://pastebin.com/raw/xbY7p5Tb| ...
- [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 ...
- 15个最佳的 JavaScript 表单验证库
客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...
- 5款最好的免费在线网站CSS验证器
这里是一个名单, 5免费在线CSS验证器的网站.这些网站让你验证你的CSS代码的自由,没有任何麻烦.你可以选择上传文件,验证CSS添加URL,或简单的复制和粘贴完整的CSS代码.好的方面是,这些网站不 ...
- TensorFlow 图片resize方法
参见这篇博客 tensorflow里面用于改变图像大小的函数是tf.image.resize_images(image, (w, h), method):image表示需要改变此存的图像,第二个参数改 ...
- gsoap内存管理与释放
(一)gSoap客户端调用WebService完成后注意内存释放顺序 //Soap资源清理 soap_destroy(soap_sp.get()); //清理反序列化的类实例 soap_end(soa ...
- stl综合
区别: List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]. Vector ...