欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP CGI FastCGI php-fpm 解惑

程序员文章站 2022-05-25 10:25:40
...
web服务器接受到浏览器的请求时,如果是静态资源就直接将其返回给浏览器;如果是动态资源,就需要CGI ,cgi可以理解为一种协议or一类处理程序,可以执行 php or python 脚本。

web服务器exec这样一个进程,然后交给他一些输入参数,他就慢慢的处理完后把结果返回给web服务器,那从协议层面来说cgi协议就是规范了web服务器和cgi程序的一些输入输出参数的含义。

CGI(Common Gateway Interface)是1993年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd Web 服务器开发的。这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立进程。CGI的第一个实现是 Perl 写的,但是 CGI 有如下问题:

  • 效率低下:每一个连接 fork 一个进程处理。
  • 功能十分有限:CGI只能收到一个请求,输出一个响应。

所以就有了Apache的mod_php,FastCGI(Fast Common Gateway Interface)

FastCGI使用进程/线程池来处理一连串的请求。这些进程/线程由FastCGI服务器管理,而不是Web服务器。 当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket长连接传递给FastCGI进程。所以FastCGI有如下的优点:

  • 性能:通过进程/线程池规避了CGI开辟新的进程的开销。
  • 兼容:非常容易改造现有CGI标准的程序。
  • 语言无关:FastCGI是一套标准,理论上讲只要能进行标准输出(stdout)的语言都可以作为FastCGI标准的Web后端。

  • Web Server隔离:FastCGI后端和Web Server运行在不同的进程中,后端的任何故障不会导致Web Server挂掉。
  • 专利:没有Apache mod_php之类的私有API的知识产权问题。
  • 扩展:FastCGI后端和Web Server通过Socket进行通信,两者可以分布式部署并方便进行横向扩展。
  • 5.phpfpm是php对fastcgi的一种具体实现,它的启动后会创建多个cgi子进程,然后主进程负责管理子进程,同时它对外提供一个socket,那web服务器当要转发一个动态请求时只需要按照fastcgi协议要求的格式将数据发往这个socket的就可以了,那phpfpm创建的子进程去争抢这个socket连接,谁抢到了谁处理并将结果返回给web服务器,那phpfpm主进程干什么了?比方说其中一个子进程异常退出了怎么办,那phpfpm会去监控他一旦发现一个cgi子进程就会又启动一个,还有其他诸多管理功能

    6 phpfpm作为一个独立的进程存在 通过socket与nginx建立连接,而mod_php 是作为一个模块被加载进了apache服务器,同时他们两作为cgi调度管理器,他们对其管理的方式也不一样