CGI,FastCGI,php-fpm的关系
CGI
CGI(Common Gateway Interface) 是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
举个例子,当浏览器输入/index.html,服务器收到请求,根据后缀判断是静态文件,则找到文件并返回。如果输入的是/index.php,那么服务器会根据后缀,把请求转发给对应的CGI程序,由CGI程序进行处理,然后返回给服务器。CGI便是规定此时服务器应该传什么数据/以什么格式传输给CGI程序的协议。
具体的交互方式,当服务器收到/index.php请求后,对启动对应的CGI程序,比如这里是PHP解释器。PHP解释器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。
FastCGI
FastCGI是CGI协议的改进版。CGI协议中,每次收到请求,都需要fork一个新进程来处理,每次都要解析php.ini文件,初始化执行环境,处理完成后,则退出进程。进程的创建跟销毁,配置的解析与环境初始化的开销很大。FastCGI改进了这个协议,FastCGI会先fork一个master进程,解析配置文件,初始化执行环境,然后fork多个work进程。当请求过来时,由work进程进行监听处理,处理完成后,则返回给服务器,然后work进程不退出,可以继续接收下一个请求。
master进程会对work进程进行管理,比如修改了php.ini文件,则重新fork多个work进程,启用新的配置文件。如果work进程不够用,则fork多几个,如果空闲work进程太多,也会停掉一些。
php-fpm
php-fpm是一个实现了FastCGI协议的程序,用来管理FastCGI进程的,即能够调度php-cgi进程的程序。php-fpm采用master/worker架构设计, master进程负责CGI、PHP公共环境的初始化及事件监听操作。worker进程负责请求的处理功能。