page contents

php架构之CGI、FastCGI、php-fpm有什么关系?

在使用PHP开发应用时,我们用的最多的无非就是LNMP、LAMP等架构,这也是PHP开发的经典架构,使用起来简单好用,可正时因为简单好用, 使得很多人仅仅停留在会使用的层次上;CGI、FastCGI、php-f...

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

attachments-2020-02-9hbScSfr5e3fbdcf5c9f9.png


一: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,服务器再返回给浏览器

FastCGI由于常驻进程,在请求量很小的时候仍然占用内存,因此,相比CGI消耗更多的系统的内存。php官方发布的php-cgi是自带FastCGI管理器的,然而在使用过程中,一旦修改php.ini配置文件,就要kill掉php-cgi进程,重新启动,不能热重启,所以又出现了php-fpm完美解决这个问题。

三:php-fpm厉害在哪?

attachments-2020-02-j6qY3bHT5e3fbdaf0560e.png

web server简单请求过程

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

怎么样?是不是感觉其实也没有想象中那么难理解,理解了这些,以后在解决问题的过程中,就能多几分把握问题关键点的几率。语言本没有好坏之分,架构则是一种思维体系,懂架构才能真正在技术的道路上越走越远。

  • 发表于 2020-02-09 16:08
  • 阅读 ( 677 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章