`

CGI、FastCGI、PHP-CGI、PHP-FPM

 
阅读更多

1、CGI

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。

CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

2、FastCGI

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

FastCGI特点

  1. FastCGI具有语言无关性.
  2. FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。
  3. FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。
  4. FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。

FastCGI的工作原理

来点PHP常识

  1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
  4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

FastCGI的不足

因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。
上面的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器

3、PHP-CGI

PHP-CGI是PHP自带的FastCGI管理器。

PHP-CGI的不足:

  1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
  2. 直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

4、PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到。

PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

现在我们可以在PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。

PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

 

5、Nginx

        Nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

        Nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回给nginx。

   

        Nginx本身不会对PHP进行解析,终端对PHP页面的请求将会被Nginx交给FastCGI进程监听的IP地址及端口,由php-fpm作为动态解析服务器处理,最后将处理结果再返回给nginx。其实,Nginx就是一个反向代理服务器。Nginx通过反向代理功能将动态请求转向后端php-fpm,从而实现对PHP的解析支持,这就是Nginx实现PHP动态解析的原理。

 

    Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。

分享到:
评论

相关推荐

    什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI.pdf

    CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI 详解 CGI(公共网关接口)是一种工具,允许HTTP服务器与程序进行“交谈”,它可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。CGI程序须运行在...

    一文读懂CGI、FastCGI、php-cgi、php-fpm的区别

    一文读懂cgi、fastcgi、php-cgi、php-fpm的区别CGI诞生之前CGI的诞生CGI程序如何工作Web服务器的内置模块FastCGIphp-fpmphp-cgiphp-cgi与php-fpm的区别 CGI诞生之前 在CGI诞生之前Web服务器负责静态文件的存储、查找...

    mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据

    - `sudo apt-get install php libapache2-mod-php` 3. **安装mod_fastcgi**: - `sudo apt-get install libapache2-mod-fastcgi` 4. **配置mod_fastcgi**: - 在`/etc/apache2/mods-available/fastcgi.conf`中...

    php-fpm.tar.gz

    PHP-FPM,全称为“PHP FastCGI Process Manager”,是PHP的一个重要组件,专为管理和优化PHP应用程序的FastCGI进程而设计。在本篇中,我们将深入探讨PHP-FPM的含义、功能以及如何在Linux环境中进行安装和使用。 ...

    php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?

    在配置PHP运行环境时,常见的技术选项包括CGI、FastCGI、PHP-CGI、PHP-FPM和Spawn-FCGI。这些技术都是用于处理PHP脚本与Web服务器之间的交互,但各有特点和适用场景。下面详细比较这些技术。 首先来看CGI(Common ...

    (完整版)[好文]mod-php和mod-fastcgi和php-fpm的介绍-对比-和性能数据.doc

    FastCGI 是一种持久的进程管理机制,它允许 CGI 程序(如 PHP)以守护进程的形式运行,而不是每次请求都启动一个新的进程。这种方式降低了资源消耗,因为 PHP 解释器只需要启动一次,可以处理多个请求。在 mod_...

    [好文]mod_php和mod_fastcgi和php-fpm的介绍,对比,和性能数据.pdf

    FastCGI是一种持久连接的协议,与CGI相比,它可以复用进程,减少每次请求创建和销毁进程的开销。mod_fastcgi在Apache中扮演的角色是调用FastCGI进程管理器(如PHP-FPM)来处理PHP请求。FastCGI进程管理器可以独立于...

    php-fpm中文文档.pdf

    1. PHP-FPM(FastCGI Process Manager)是一个用C语言编写的FastCGI管理器,用于提升PHP的性能。它对于使用PHP的网站和应用程序尤其重要,因为它可以管理多个PHP进程,提高对动态内容请求的处理效率。 2. FastCGI是...

    cgi4j-master.zip

    CGI4J是一个Java库,专为连接PHP-FPM(FastCGI进程管理器)而设计。它允许Java开发者在他们的应用程序中集成PHP代码,实现PHP功能与Java环境的无缝交互。通过CGI4J,可以轻松地在Java应用中调用PHP脚本,利用PHP丰富...

    LAMP+php-fpm服务器+php7.16

    "LAMP+php-fpm服务器+php7.1.6"是一个经典的配置,它结合了Linux操作系统、Apache HTTP服务器、MySQL数据库和PHP解释器,通过添加php-fpm(FastCGI Process Manager)进一步提升了性能。 **LAMP架构** LAMP代表...

    PHP-FPM实现性能优化

    PHP-FPM(FastCGI Process Manager)是PHP的一个重要组件,它作为PHP FastCGI的管理器,负责处理来自Web服务器(如Nginx)的PHP请求。在Nginx上运行PHP应用程序时,通常会将请求转发给PHP-FPM进行解析和执行。从PHP ...

    cgi.rar_c cgi_cgi_cgi-web_cgi-webserver_网页 cgi

    后来出现了FastCGI、CGI的模块化版本如mod_perl(Apache与Perl的结合)和PHP-FPM(PHP FastCGI进程管理器),它们提高了性能并降低了资源消耗。 8. 文件“cgi.doc”可能包含的细节:这份文档可能详细介绍了如何使用...

    Nginx+PHP-FPM+APC=绝妙的组合.pdf

    PHP-FPM(PHP FastCGI Process Manager)是PHP的一个补丁,它将FastCGI进程管理集成到PHP中,替代了传统的spawn-fcgi。PHP-FPM能够更智能地管理PHP进程,根据需要启动和终止PHP-CGI进程,从而减少内存占用并提高响应...

    php7.3.33.tar.gz 源码安装包

    include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; } ``` 并启用PHP-FPM服务: ```bash sudo systemctl start php7.3-fpm sudo systemctl enable php7.3-fpm ``` ### 七、...

    php-fpm5.5.8

    PHP-FPM(FastCGI Process Manager)是PHP的一个重要组成部分,它提供了一个高效且易于管理的FastCGI服务来处理PHP脚本。在PHP 5.5.8版本中,PHP-FPM作为一个可选的扩展被集成,为服务器环境提供了更好的性能优化和...

    mod_php、FastCGI、PHP-FPM等PHP运行方式对比

    在PHP的运行环境中,有多种不同的处理方式,其中包括mod_php、FastCGI和PHP-FPM。这些方式决定了Web服务器如何与PHP解释器交互,从而处理动态PHP内容。 **mod_php** 是Apache Web服务器中集成PHP解释器的常见方式。...

    PHP-FPM不完全指南1

    FastCGI是一种常驻型的接口,相比传统的CGI,它可以提高服务器处理PHP脚本的效率。在启动PHP-FPM时,它首先读取php.ini配置文件,然后加载php-fpm.conf以及可能存在的其他*.conf配置文件,这些配置文件可以用来定制...

    源码安装nginx+php-fpm+http push测试通过

    4. **编译安装PHP**:配置`PHP`的编译选项,包括`--with-php-fpm`以启用FastCGI模式,同时添加`--with-openssl`和`--with-zlib`。完成编译后,同样执行`make`和`make install`。 5. **配置Nginx**:编辑`nginx.conf...

    nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)

    标题中的“nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)”是一个常见的错误信息,这通常发生在Nginx尝试与PHP-FPM(FastCGI进程管理器)通信时,但遇到了资源暂时...

Global site tag (gtag.js) - Google Analytics