php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单


php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

文章插图
【php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单】lnmp
在使用php开发应用时 , 我们用的最多的无非就是LNMP、LAMP等架构 , 这也是PHP开发的经典架构 , 使用起来简单好用 , 可正时因为简单好用 ,  使得很多人仅仅停留在会使用的层次上;CGI、FastCGI、php-fpm这些名词我们经常听到 , 但是你真的知道它们在整个架构中处于什么位置发挥什么作用吗?看完这篇文章 , 保证你如醍醐灌顶一般 , 清清楚楚 。
 
php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

文章插图
http/https
 
一:CGI是什么?CGI是一种协议 , 全称公共网关接口(Common Gateway Interface) , 什么是协议 , 就是一套标准 , 比如我们平时接触最多的http/https 。CGI专门用在webServer(Nginx、Apache)与CGI程序之间通信 , CGI应用程序就是用编程语言编写的应用程序 , 前提是这种语言具有标准输入、输出以及环境变量 , 比如php-cgi 。
我们的webServer在收到用户的.php类型的请求 , 就会把请求提交给cgi程序 , 这时php-cgi程序根据提交参数进行处理 , 然后按照标准输出给webServer相应的html内容 , 服务器再返回给浏览器 。整个过程中 , CGI扮演了中间人的身份 , 完全独立于服务器和应用程序(php-cgi)之外 。
然而CGI有个很大的缺点 , 每一次的web请求都会退出进程 , 这也意味着每次请求都要重新开启进程 , 造成系统资源的浪费 , 在高并发的场景中 , 显然这不是最优的选择 , 因此就出现了FastCGI 。
二:FastCGI又是什么?FastCGI , 从名字上看 , 应该是CGI的升级版 , 可以这么理解吧;不同于CGI的是 , FastCGI是一种数据交互的二进制协议 , 没错 , 它仍然是一种协议 , 它的目的在于降低webServer与应用程序(php-cgi)之间交互的负载 , 提高单位时间内请求的吞吐量 。
FastCGI使用常驻进程的方式处理请求 , 这些常驻进程都由FastCGI Server统一管理 , 跟webServer没有任何关系 , 请求过来时 , webServer将环境变量和信息通过进程间通讯发送给FastCGI进程 , 处理完后返回给webServer , 服务器再返回给浏览器 。
php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

文章插图
万维网
FastCGI由于常驻进程 , 在请求量很小的时候仍然占用内存 , 因此 , 相比CGI消耗更多的系统的内存 。php官方发布的php-cgi是自带FastCGI管理器的 , 然而在使用过程中 , 一旦修改php.ini配置文件 , 就要kill掉php-cgi进程 , 重新启动 , 不能热重启 , 所以又出现了php-fpm完美解决这个问题 。
三:php-fpm厉害在哪? 
php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

文章插图
web server简单请求过程
PHP-FPM全称:PHP FastCGI Process Manager , 是用于管理php-fastcgi进程的管理器 , php-fpm会开启一个master进程常驻 , 这个进程用来管理其他子进程work , 而work进程则是按需开启 , 如果在一定时间段里没有请求到work进程 , work进程就会被关闭 , 而当请求数量增大时 , 则会开启多个work进程来应付大量请求 , work进程的最大数量不超过配置进程数 。这样对进程池形成了很好的管理 。也完美解决了上述两个问题 。
php架构之CGI、FastCGI、php-fpm有什么关系?原来这么简单

文章插图
php架构
怎么样?是不是感觉其实也没有想象中那么难理解 , 理解了这些 , 以后在解决问题的过程中 , 就能多几分把握问题关键点的几率 。语言本没有好坏之分 , 架构则是一种思维体系 , 懂架构才能真正在技术的道路上越走越远 。
今天的分享就到这里了 , 下期见!如果喜欢我的内容 , 关注我 , 下期更精彩~~




    推荐阅读