CGI的由来
早期的web服务器,只能响应浏览器发来的HTTP静态资源的请求。随着Web技术的发展,逐渐出现了动态技术,但是Web服务器并不能够直接运行动态脚本,为了解决Web服务器与外部应用程序(CGI程序)之间数据互通,于是出现了CGI(Common Gateway Interface)通用网关接口。
什么是CGI
CGI只是一个接口规范或协议,它的实现则与具体的编程语言相关。
CGI的工作原理
Web服务器一般只用来处理静态文件请求,当碰到动态脚本请求时,Web服务器主进程就会创建一个新的进程来启动CGI程序,也就是将动态脚本交给CGI程序来处理。启动CGI程序需要一个过程,如读取配置文件,加载扩展,初始化环境等。CGI解析完动态脚本后将结果返回给服务器,最后Web服务器将结果返回给客户端,之前创建的进程也随之关闭。
这样每次用户请求动态脚本,Web服务器都要重新去创建一个新进程去启动CGI程序,读取配置文件,初始化环境等重复性操作,CGI程序处理完动态脚本后又会随之关闭,这样周而复始,其效率是非常低下的。于是便出现了FastCGI。
PHP-CGI
PHP-CGI就是CGI协议的php版本实现。除了协议本身的问题还有一些其他问题 比如
- PHP-CGI变成php.ini配置后,需要重启php-cgi才能让新的配置生效,不可以平滑重启。
- 直接杀死PHP-CGI进程,php就不能运行了。 而后来的PHP-FPM则完美解决了这两个问题并且其他方面表现也更强劲。
Web服务器内置模块
后来出现了一种比较高效的方式:Web服务器内置模块。例如Apache的mod_php模块,将PHP解释器做成模块加载到Apache服务器中。
Apache服务器在启动的时候,就会同时启动PHP模块。当客户端请求PHP文件时,Apache就不用在创建出一个新进程来启动PHP解释器,而是直接将PHP文件交给运行中的PHP模块处理。效率相比CGI较高。
由于在Apache服务器启动时才会读取PHP配置文件,加载PHP模块,所以修改配置文件php.ini后,必须重启Apache,新的配置文件才会生效。
什么是FastCGI
FastCGI是Web服务器与处理程序之间通信的一种协议,是CGI的改进版。
它是常驻行的CGI,可以一直运行。在请求到达时不会耗费时间去创建一个进程来处理。FastCGI是语言无关的,可伸缩架构的CGI开放扩展,它将CGI解释器进程保持在内存中,因此获取较高的性能。
FastCGI的工作原理
Web服务器启动时载入FastCGI进程管理,如IIS的ISAPI,Apache的Moudule...
FastCGI进程管理器自身初始化,并启动多个CGI解释器进程并等待Web服务器的连接。
当客户端请求到达Web服务器时,通过FastCGI进程管理器分发给其中一个CGI解释器
CGI解释器处理完请求后将结果返回给Web服务器,Web服务器在返回给客户端。此时当前CGI解释器进程接着等待并处理来自FastCGI进程管理器的下一个请求。如果在CGI模式中,当前CGI解释器会在此退出。
什么是PHP-FPM
FastCGI是一个协议,PHP-FPM是PHP版本协议的实现。是FastCGI的一种进程管理工具。
PHP-FPM的工作原理
当前PHP-FPm启动时,首先会创建一个master进程,负责请求的分发,初始化环境,加载配置文件等一些初始化操作,然后根据配置的设定启动多个woker进程
当请求过来时,master进程将请求分发给其中一个woker进程处理,然后可以立即接受下一个请求,避免了重复的初始化操作,提升了效率
当woker进程不够用时,master进程还可以根据配置预先启动几个woker进程等着,当空闲进程太多又会关掉一些。提高了性能,节约了系统资源。
当改变了php.ini配置文件,不用重启PHP-FPM,最新的woker则采用的是最新的配置,这样也做到了平滑过渡。