PHP中的CGI、PHP-CGI、FastCGI、PHP-FPM到底是什么?
根据自己的理解以及查阅部分文章资料后,简单的总结了下各自的概念、联系、区别。部分用词不甚严谨,以后对各种原理理解深入时,再回过头来更改。该文只做参考。
CGI(Common Gateway Interface): 公共网关接口
这是一个与语言无关的,在Web服务器与应用程序之间数据交换的一种通信协议。只是规定应用间以哪种格式交换数据,可以使用C、PHP、Python等语言实现。
工作原理是Web服务器收到用户请求,就会请求操作系统生成一个新的CGI解释器进程(如php-cgi.exe),CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。每次请求都需要重复以上过程,当访问量增大,这种方式就不合适了,于是FastCGI出现,CGI逐渐退出历史。
FastCGI: CGI通信协议的优化版
FastCGI像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。该协议同样与语言无关。
PHP-CGI: PHP官方出品的CGI解释器
PHP-CGI只是实现CGI的解释器,不会管理进程。当每次接到Web服务器的请求都会开启一个进程进行处理,而且开启进程的过程中会先要重载配置,数据结构以及初始化运行环境,如果更新了PHP配置,那么就需要重启PHP-CGI才能生效。没有实现PHP配置的平滑重启功能。
PHP-FPM(PHP Fastcgi Process Manager): FastCGI的进程管理器
因为它很好的解决了PHP-CGI的问题,能够实现平滑重启,并提供了进程管理功能,还能调度PHP-CGI程序。
工作模式与Nginx类似,都是启动的进程包含Master进程和Worker进程两种。Master进程只有一个,负责监听端口分发请求,接收来自Web服务器的请求,而Worker进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个PHP解释器,是PHP代码真正执行的地方。
刚出现时只是一个第三方的PHP补丁形式使用,经过逐步完善后被官方收录。