最近有幸读到一篇文章,一文将CGI 的进化史讲的特别详细,虽然我本身以前也整理过 CGI、FastCGI、PHP-FPM 相关的笔记,可是并无从原理的角度来认识 CGI。php
早些年的Web 应用很简单,客户端经过浏览器发起请求,服务端直接返回响应。nginx
随着互联网的发展,简单的Web 应用已经不能知足开发者们了。
咱们但愿Web服务器有更多的功能,飞速发展的同时还能让不一样语言的开发者也能加入。sql
CGI协议协议的诞生就是 Web服务器和其余领域的开发者在保证遵照协议的基础上,剩下的能够自由发挥,而实现这个协议的脚本叫作CGI 程序。浏览器
CGI协议规定了须要向CGI脚本设置的环境变量和一些其余信息,CGI程序完成某一个功能,能够用PHP,Python,Shell或者C语言编写。服务器
在没有CGI 以前,其余语言若是须要接入Mysql 或者Memcache,还须要使用C 语言,但有了CGI协议,咱们的Web处理流程能够变成下图这样:socket
CGI程序存在致命的缺点:每当客户端发起请求,服务器将请求转发给CGI,WEB 服务器就请求操做系统生成一个新的CGI解释器进程(如php-cgi),CGI进程则处理完一个请求后退出,下一个请求来时再建立新进程。php-fpm
咱们知道,执行一个PHP程序的必需要先解析php.ini
文件,而后模块初始化等等一系列工做,每次都反复这样很是浪费资源。post
FastCGI协议在CGI协议的基础上,作出了以下改变:spa
long-lived
)应用进程,减小了fork-and-execute
带来的开销咱们称实现了FastCGI协议的程序为FastCGI程序,FastCGI程序的交互方式以下图所示:操作系统
FastCGI 程序当然已经很好了,但咱们的需求老是有点苛刻,它仍是存在一些明显缺点的:
php.ini
)后,php-cgi
(FastCGI 程序) 没法平滑重启php-cgi
还没作到上面说起php-cgi 实现的FastCGI问题官方没有解决,幸运的是有第三方帮咱们解决了,它就是 php-fpm
。
它能够独立运行,不依赖php-cgi,换句话说,它本身实现了FastCGI协议而且支持进程平滑重启且带进程管理功能。