共计 1084 个字符,预计需要花费 3 分钟才能阅读完成。
最近有幸读到一篇文章,一文将 CGI 的进化史讲的特地具体,尽管我本人之前也整顿过 CGI、FastCGI、PHP-FPM 相干的笔记,然而并没有从原理的角度来意识 CGI。
CGI 的诞生
早些年的 Web 利用很简略,客户端通过浏览器发动申请,服务端间接返回响应。
随着互联网的倒退,简略的 Web 利用曾经不能满足开发者们了。
咱们心愿 Web 服务器有更多的性能,飞速发展的同时还能让不同语言的开发者也能退出。
CGI 协定协定的诞生就是 Web 服务器和其余畛域的开发者在保障恪守协定的根底上,剩下的能够自由发挥,而实现这个协定的脚本叫做 CGI 程序。
CGI 协定规定了须要向 CGI 脚本设置的环境变量和一些其余信息,CGI 程序实现某一个性能,能够用 PHP,Python,Shell 或者 C 语言编写。
在没有 CGI 之前,其余语言如果须要接入 Mysql 或者 Memcache,还须要应用 C 语言,但有了 CGI 协定,咱们的 Web 解决流程能够变成下图这样:
FastCGI 的诞生
CGI 程序存在致命的毛病:每当客户端发动申请,服务器将申请转发给 CGI,WEB 服务器就申请操作系统生成一个新的 CGI 解释器过程(如 php-cgi),CGI 过程则解决完一个申请后退出,下一个申请来时再创立新过程。
咱们晓得,执行一个 PHP 程序的必须要先解析 php.ini
文件,而后模块初始化等等一系列工作,每次都重复这样十分浪费资源。
FastCGI 协定在 CGI 协定的根底上,做出了如下扭转:
- FastCGI 被设计用来反对常驻(
long-lived
)利用过程,缩小了fork-and-execute
带来的开销 - FastCGI 过程通过监听的 socket,收来自 Web 服务器的连贯,这样 FastCGI 过程能够独立部署
- 服务器和 FastCGI 监听的 socket 之间依照音讯的模式发送环境变量和其余数据
咱们称实现了 FastCGI 协定的程序为 FastCGI 程序,FastCGI 程序的交互方式如下图所示:
PHP-FPM 的诞生
FastCGI 程序诚然曾经很好了,但咱们的需要总是有点刻薄,它还是存在一些显著毛病的:
- 当咱们更改配置文件 (
php.ini
) 后,php-cgi
(FastCGI 程序)无奈平滑重启 - 咱们 fork 的过程个数和申请量反比,申请忙碌时 fork 过程多,动静调整
php-cgi
还没做到
下面提及 php-cgi 实现的 FastCGI 问题官网没有解决,侥幸的是有第三方帮咱们解决了,它就是 php-fpm
。
它能够独立运行,不依赖 php-cgi,换句话说,它本人实现了 FastCGI 协定并且反对过程平滑重启且带过程治理性能。
参考链接
- 从 CGI 到 FastCGI 到 PHP-FPM