zoukankan      html  css  js  c++  java
  • CGI、FastCGI和php-fpm概念和区别

    CGI
    CGI(Common Gateway Interface),公共网关接口,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准。
    如请求/index.html,那么web server会去指定目录下找到这个文件(如果存在的话)发送给浏览器,这里分发的是静态数据。那么,请求的是/index.php的时候,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。CGI就是规定客户端向web server请求数据的时候,要传哪些数据、以什么样的格式传递的一种协议。
    通过CGI接口,Web服务器就能够获取客户端提交的信息,并转交给服务器端的CGI程序处理,最后返回结果给客户端。一般地,我们提到的CGI实际上是实现了CGI接口标准的程序,用来处理客户请求。CGI程序可以用C、perl、php等来编写。

    以前,web服务器一般只处理静态的请求,如果碰到一个动态请求,web服务器会根据这次请求的内容,然后fork一个进程启动CGI程序,这里就是指PHP的解析器,PHP解析器程序启动后,它就会解析php.ini文件,初始化执行环境,然后解析动态脚本,再把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新的子进程启动CGI程序,周而复始的进行。启动CGI程序需要读取配置文件、加载相关扩展等,这样的工作效率非常低下。

    Web服务器内置模块
    由于以CGI程序处理动态请求的工作模式效率非常低,因此出现了较高效的方式:Web服务器内置模块,如apache的mod_php模块、微软iis的ISAPI、nginx的php-fpm,将php解释器做成模块加载到服务器中。这样,随着服务器的启动,PHP解释器模块也会随之启动。不用像上面的那种方式每处理一个动态请求就要启动一次CGI程序,而是在服务器启动时,读取php配置文件,加载php模块。
    此外,mod_php 通过嵌入 PHP 解释器到 Apache 进程中,只能与 Apache 配合使用,而 cgi 和 fast-cgi 以独立的进程的形式出现,只要对应的Web服务器实现 cgi 或者 fast-cgi 协议,就能够处理 PHP 请求。mod_php 这种嵌入的方式最大的弊端就是内存占用大,不论是否用到 PHP 解释器都会将其加载到内存中。

    FastCGI
    参考链接:https://www.cnblogs.com/wt645631686/p/8065103.html
    (1)FastCGI是一种进程管理工具,它可以在内存中管理CGI进程。
    (2)FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着。
    (3)FastCGI程序也可以和Web服务器分别部署在不同的主机上,它还可以接受来自其他Web服务器的请求。
    (4)FastCGI也是语言无关的。其主要行为是将CGI解释器进程保持在内存中并因此获得高效的性能。
    (5)FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。
    (6)当客户端请求Web服务器上的动态脚本时,Web服务器会将动态脚本通过TCP协议交给FastCGI主进程,FastCGI主进程根据情况,安排一个空闲的子进程来解析动态脚本,处理完成后将结果返回给Web服务器,Web服务器再将结果返回给客户端。该客户端请求处理完毕后,FastCGI子进程并不会随之关闭,而是继续等待主进程安排工作任务。
    原理图及运行过程:

    (1)Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
    (2)FastCGI会先启一个master,解析配置文件,初始化执行环境,然后启动多个CGI解释器进程(php-cgi,即worker),并等待来自Web Server的连接。
    (3)当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器(即分配给一个worker)。然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
    (4)FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 (在CGI模式中,php-cgi在此便退出了)
    在PHP的配置文件中,可以看到php-cgi的存在:


    PHP-FPM
    PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能,被PHP官方收了。
    php-fpm就是php中的FastCGI进程管理器。进程包括master进程和worker进程。master进程只有一个,负责管理子进程(注意,这里有人认为master进程负责将客户端的请求交给worker进程处理的观点是不正确的,请看 (十)PHP-FPM的三种模式和worker进程、master进程详解 这篇博文中的实例,将master进程kill掉,客户端请求依旧能得到响应结果)。worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,处理PHP代码。
    如果在Linux上搭建Nginx和PHP环境,则需要安装PHP-FPM模块,让php以FastCGI的方式与nginx进行交互。
    转载:https://blog.csdn.net/IT_10/article/details/92801153

  • 相关阅读:
    HDU 2717 Catch That Cow
    补题列表
    Codeforces 862C 异或!
    HDU 2084
    HDU 2037
    Codeforces 492B
    POJ 2262
    Codeforces 1037A
    HDU 1276
    itertools — Functions creating iterators for efficient looping
  • 原文地址:https://www.cnblogs.com/xiangshihua/p/13289202.html
Copyright © 2011-2022 走看看