深入剖析 Web 服务器与 PHP 应用的通信机制 - 掌握 CGI 和 FastCGI 协议的运行原理
Web 服务器和 FastCGI 交互过程
为什么需要在消息头发送 RequestID 这个标识? 如果是每个连接仅处理一个请求,发送 RequestID 则略显多余。 但是我们的 Web 服务器和 FastCGI 进程之间的连接可能处理多个请求,即一个连接可以处理多个请求。所以才需要采用数据包协议而不是直接使用单个数据流的原因:以实现「多路复用」。 因此,由于每个数据包都包含唯一的 RequestID,所以 Web 服务器才能在一个连接上发送任意数量的请求,并且 FastCGI 进程也能够从一个连接上接收到任意数量的请求数据包。 另外我们还需要明确一点就是 Web 服务器 与 FastCGI 进程间通信是 无序的。即使我们在交互过程中看起来一个请求是有序的,但是我们的 Web 服务器也有可能在同一时间发出几十个 BEGIN_REQUEST 类型的数据包,以此类推。 PHP-FPM 其实讲解完 CGI 和 FastCGI 协议,基本上我们就已经研究完 「Web 服务器与 PHP 应用之间的通信机制」这个问题了。但是对于我们 PHP 软件工程师来讲,可能还会遇到「什么是 PHP-FPM」及其相关问题。这里我们一并来稍微讲解一下。 PHP-FPM 是 FastCGI 进程管理器(PHP FastCGI Process Manager)(http://php.net/manual/zh/install.fpm.php),用于替换 PHP 内核的 FastCGI 的大部分附加功能(或者说一种替代的 PHP FastCGI 实现),对于高负载网站是非常有用的。 下面是官网中获取到的它所支持的特性:
那么 PHP-FPM 是如何工作的呢? PHP-FPM 进程管理器有两种进程组成,一个 Master 进程和多个 Worker 进程。Master 进程负责监听端口,接收来自 Web 服务器的请求,然后指派具体的 Worker 进程处理请求;worker 进程则一般有多个 (依据配置决定进程数),每个进程内部都嵌入了一个 PHP 解释器,用来执行 PHP 代码。 Nginx 服务器如何与 FastCGI 协同工作 Nginx 服务器无法直接与 FastCGI 服务器进行通信,需要启用 ngx_http_fastcgi_module 模块进行代理配置,才能将请求发送给 FastCGI 服务。 其中,包括我们熟知的配置指令:
你可以到 PHP FastCGI 实例教程 (https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)学习一些基本使用。 总结 到这里我们基本就学习完 CGI、FastCGI、PHP-FPM以及 Nginx 服务器与 FastCGI 服务通信原理。一句话: CGI 和 FastCGI 是一种协议和 HTTP 协议一样位于应用层,与语言无关;PHP-FPM 是一种 FastCGI 协议的实现,能够管理 FastCGI 进程。 【编辑推荐】
点赞 0 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |