离开 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
Reference
深入剖析 Web 服务器与 PHP 应用之间的通信机制 – 掌握 CGI 和 FastCGI 协议的运行原理\
什么是CGI FastCGI PHP-CGI PHP-FPM Spawn-CGI?它们之间的关系
CGI、FastCGI和PHP-FPM关系图解\
注:此文对 PHP-CGI 的解释可能有误。
本作品采用《CC 协议》,转载必须注明作者和本文链接