CGI和FastCGI
概念
CGI
全称是common gateway interface
, 说明它是一个网关接口, 是一种协议, 没有具体实现. 和java的JDBC
是一个意思.
FastCGI
全称是fast common gateway interface
, 它也是一个网关接口, 只是在CGI
接口上做了一层封装.
但是CGI
协议并没有考虑到性能问题, 实现了CGI
协议的程序在执行完任务后就会销毁进程, 当有新的任务时, 又要重新启动进程.
而FastCGI
协议考虑到了性能问题, 实现了FastCGI
协议的程序, 会先启动一个master进程作为管理员, 然后启动多个worker进程(相当于CGI
)作为任务执行者. 并且这些worker进程的管理类似于线程池.
伪代码
interface CGI{
createWorkderThenParsePhpFile();
}
interface FastCGI{
createMasterToManageWorkers();
createWorkderThenParsePhpFile();
}
通过上面的伪代码可以发现, FastCGI只是在CGI接口上面做了一层封装(编程就是套娃的过程), 写了一个管理方法createMasterToManageWorkers
.
php-cgi和php-fpm
php-cgi
和php-fpm
是对CGI
和FastCGI
的实现, 它们两个都是应用程序.
在最开始只有php-cgi
, 并且实现了CGI
和FastCGI
两种协议, 但是那个写代码的人水平不够高, 所以内部执行效率低下.
后来出现一个高手写了php-fpm
应用程序, 用来实现两种协议, 这个应用程序效率很高, 被php官方盯上了, 把php-fpm
收入自己腰包.(最开始php-fpm是外部插件, 现在已经内部集成).
总结
CGI
和FastCGI
都是协议, 是一种规范. php-cgi
和php-fpm
都是实现了规范的程序, 其中php-fpm
代码质量高, 执行效率好.
参考资料
PHP中CGI、CLI、FPM是什么 搞不清FastCgi与PHP-fpm之间是个什么样的关系 php-cli和php-fpm的关系是什么? php-cgi是php脚本的解析器吗?