CGI + FastCGI(PHP-FPM)联系与区别 【图解 + 注释】
〇、背景
参考了几篇文章,总结成 图解 + 注释 方便以后查阅。
参考资料:
1、https://www.zhihu.com/question/19582041
2、https://segmentfault.com/q/1010000000256516
一、CGI
1、什么是 CGI
CGI(Common Gateway Interface,通用网关接口)
,是服务器与程序(或脚本)进行通信的接口。CGI 使程序员能够编写自己的动态 Web 应用程序。
2、原理
CGI 采用的是“fork-and-execute”的工作模式。即:
对一个 CGI 程序,做的工作其实只有:从环境变量(environment variables)和标准输入(standard input)中读取数据、处理数据、向标准输出(standard output)输出数据。
1、环境变量 中存储的叫 Request Meta-Variables,也就是诸如 QUERY_STRING、PATH_INFO 之类的东西,这些是由 Web Server 通过环境变量传递给 CGI 程序的,CGI 程序也是从环境变量中读取的。
2、标准输入 中存放的往往是用户通过 PUTS 或者 POST 提交的数据,这些数据也是由 Web Server 传过来的。
3、优缺点
优点:设计简单
缺点:效率低下,每个请求都需要fork一个新的CGI进程去处理。
二、FastCGI(PHP-FPM)
1、什么是 FastCGI
FastCGI(快速通用网关接口)
,是CGI的增强版本。其目的在于,减少Web服务器与CGI程序之间交互的开销,使得服务器可以同时处理更多的请求。
2、原理
与 CGI 的 “fork-and-execute” 工作模式不同,FastCGI 是 “master-worker” 工作模式。像是一个常驻型的 CGI(守护进程),可以通过配置多个进程,来处理一连串的请求。
注:
PHP-FPM
是 FastCGI 协议 的一个实现- 自 PHP 5.3版,PHP 内置 了PHP-FPM
使用 --enalbe-fpm 这个编译参数
3、优缺点
优点:提高服务器的性能
缺点:比较耗费资源
4、注意事项
(1)关于平滑重启
修改 php.ini 之后,php-cgi 进程的确是没办法平滑重启的。php-fpm 对此的处理机制是新的 worker 用新的配置,已经存在的 worker 处理完手上的活就可以歇着了,通过这种机制来平滑过度。
三、[拓展] WSGI
WSGI
也是一种基于 CGI ,跟 FastCGI 类似的规范,专用于 python 领域。
参考我的另一篇文章:《Dash by Plotly 学习笔记》