IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Php-fpm 与 FastCGI / CGI 的关系 -> 正文阅读

[PHP知识库]Php-fpm 与 FastCGI / CGI 的关系

一、CGI协议

CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。

CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如php,perl,tcl等。


运行原理

客户端访问某个 URL 地址之后,通过 GET/POST/PUT 等方式提交数据,并通过 HTTP 协议向 Web 服务器发出请求。
服务器端的 HTTP Daemon(守护进程)启动一个子进程。然后在子进程中,将 HTTP 请求里描述的信息通过标准输入 stdin 和环境变量传递给 URL 指定的 CGI 程序,并启动此应用程序进行处理,处理结果通过标准输出 stdout 返回给 HTTP Daemon 子进程。
再由 HTTP Daemon 子进程通过 HTTP 协议返回给客户端。

举例请求的流程如下:

客户端访问 http://127.0.0.1:9003/cgi-bin/user?id=1

1)127.0.0.1 上监听 9003 端口的守护进程接受到该请求
2)通过解析 HTTP 头信息,得知是 GET 请求,并且请求的是 /cgi-bin/ 目录下的 user 文件。
3)将 uri 里的 id=1 通过存入 QUERY_STRING 环境变量。
4)Web 守护进程 fork 一个子进程,然后在子进程中执行 user 程序,通过环境变量获取到id。
5)执行完毕之后,将结果通过标准输出返回到子进程。
6)子进程将结果返回给客户端。

二、FastCGI 协议

FastCGI是用于让Web服务器与应用程序进行通信的二进制协议(而不是人类可读的文本协议),是早期的通用网关接口(CGI)的变体。?

FastCGI的主要目的是减少Web服务器和CGI程序之间的接口相关的资源开销,从而使服务器在单位时间内能够处理更多的Web请求。

FastCGI是CGI协议的改进,它可以持续执行,而不需要像CGI一样,每次都需要重新fork,正因为如此,它处理请求的效率很高。

FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署

由于FastCGI是对CGI的改进,协议底层依然是与CGI兼容的。

运行原理


1)FastCGI 进程管理器启动时会创建一个主进程(Master,它是进程管理器)和多个 CGI 解释器进程(Worker),然后等待 Web 服务器的连接。

2)Web 服务器接收 HTTP 请求后,会与 FastCGI 进程管理器进行 Socket 通信,向FastCGI进程管理器发送二进制数据,FastCGI进程管理器一般会根据负载情况,转发这些包含CGI 环境变量和标准输入数据的消息给 相应的CGI 解释器进程。

3)CGI 解释器进程接收到消息,完成处理后将标准输出和错误信息从同一连接返回 Web服务器。

4)CGI 解释器进程接着会持续监听,等待来自 Web 服务器的下一个请求。

FastCGI协议组成

与HTTP协议不同,FastCGI协议直接使用二进制传递数据,而不像HTTP协议使用人类可读的文本。

在FastCGI中,每一个HTTP请求(或者响应)消息都分为若干个记录(Record)进行传递, 每个Record又由头部(Header)和数据(Body)组成。

Header是针对这个Record的一些元信息描述(如请求ID、Record类型、Data长度等等),Body是指这个Record中实际的有效数据,下面是1个Record的结构示意图:

|———-—-Record————-|
| Header | ?Body ?|


使用Record进行消息传递优点:

1)多个请求的数据可以复用同一个连接进行传输,这样应用的实现就可以采用事件驱动的编程模型或者多线程编程模型以提升效率;

2)同一个请求中的多个数据流的数据可以通过封装成不同记录的形式在同一个连接上传输,例如 STDOUT 和 STDERR 两个输出流的数据可以通过同一个连接返回给 Web 服务器,而不是不得不使用2个连接。


Record 结构体如下

typedef struct {
? /* Header */
? unsigned char version; // FastCGI版本
? unsigned char type; // 当前Record的类型
? unsigned char requestIdB1; // 当前Record对应的请求id ?
? unsigned char requestIdB0;
? unsigned char contentLengthB1; // 当前Record中Body体数据的长度
? unsigned char contentLengthB0;
? unsigned char paddingLength; // Body中填充块的长度
? unsigned char reserved;?

? /* Body */
? unsigned char contentData[contentLength]; // Body体数据
? unsigned char paddingData[paddingLength]; // Body中填充块长度
} FCGI_Record;

每个字段的具体含义如下:

version:表示FastCGI协议版本号,目前它的值固定为1
type:表示此记录(Record)的类型,标记此记录的主要功能。目前FastCGI协议定义了11种类型的记录(后面会具体解释)。
requestId :表示此记录属于哪个 FastCGI 请求。因为FastCGI与CGI不同,需要常驻后台,连续处理多个请求,所以需要通过requestId来对请求进行识别,不然会造成混淆。
contentLength : 表示紧接着的 contentData 的长度,占2个字节,共16位,所以能够表示0~65535直接的数字。
paddingLength : 表示紧接着的 paddingData 的长度。
contentData : 字节数组,表示有效数据,长度范围只能在 [0, 65535]之间,根据记录类型不同需要采用不同的解析方法。
paddingData : 填充的字节数组,无实际意义,长度范围在 [0, 255],处理时忽略该内容。

三、Php-fpm :基于PHP语言实现的FastCGI进程管理器

FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。

PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理。

参考:

FastCGI - 走看看 (zoukankan.com)

FastCGI协议详解 - Secret Garden (aiddroid.com)

PHP-FPM是什么? - 知乎 (zhihu.com)

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:20:14  更:2022-04-18 17:20:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 18:16:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码