离开 CGI,FastCGI,PHP-FPM 谈高可用挺空中楼阁的!

身为 PHP 后端开发的程序猿,职业生涯中自然少不了接触高可用相关的 Web 产品。对于初中级段位的 PHP 来说面试中谈及高可用我们可能对服务器集群负载均衡,数据库分库分表,数据库读写分离,缓存集群和消息中间件比较熟悉。但是涉及到 CGI,FastCGI,PHP-FPM 好像就比较陌生。其实从我们开始使用 PHP 开发 Web 应用时,就已经和 CGI 打交道了。只是我们平常并没有关注到 Web 服务器和 PHP 应用之间的通信方式,其实这些知识点很容易理解。但是如果对它们一知半解,就很难搭建出高性能的服务器。

我们需要了解下 Nginx 和 PHP 是怎么协作的,下面拿 Nginx 举例。我们首先来认识下 CGI 和 FastCGI 这两个协议,并关注它们之间的区别。

CGI#

CGI 全称是 “通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在 Web 服务器上的程序请求数据。 CGI 描述了客户端和这个程序之间传输数据的一种标准。 CGI 的一个目的是要独立于任何语言的,所以 CGI 可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。 如 php,perl,tcl 等。

FastCGI : 像是一个常驻 (long-live) 型的 CGI:#

FastCGI 是 Web 服务器和处理程序之间通信的一种协议, 是 CGI 的一种改进方案,FastCGI 像是一个常驻 (long-lived) 型的 CGI, 它可以一直执行,在请求到达时不会花费时间去 fork 一个进程来处理 (这是 CGI 最为人诟病的 fork-and-execute 模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。

FastCGI 是与语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。

FASTCGI 相对于 CGI 的优势:#

CGI 解释器的反复加载是 CGI 性能低下的主要原因 \
如果 CGI 解释器保持在内存中并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over 特性等等 \
可以想象 CGI 通常有多慢。每一个 Web 请求 PHP 都必须重新解析 php.ini、重新载入全部扩展并重初始化全部数据结构。\
使用 FastCGI, 所有这些都只在进程启动时发生一次。一个额外的好处是,可以持续数据库连接工作

到这里就对 CGI,和 FastCGI 有初步印象了吧。

PHP-FPM#

PHP 的 FastCGI 进程管理器 。

Reference#

深入剖析 Web 服务器与 PHP 应用之间的通信机制 – 掌握 CGI 和 FastCGI 协议的运行原理 \

什么是 CGI FastCGI PHP-CGI PHP-FPM Spawn-CGI? 它们之间的关系

CGI、FastCGI 和 PHP-FPM 关系图解 \
注:此文对 PHP-CGI 的解释可能有误。

本作品采用《CC 协议》,转载必须注明作者和本文链接
相信时间和变化
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。