PHP填坑记之FastCGI与mod_php详解

背景

PHP最经常使用的方式是以模块的方式(mod_php)运行在Apache中,也是Apache运行PHP的默认方式;但在Nginx中,Nginx又使用的是PHP-FPM,可是PHP-FPM究竟是个什么东东?跟php有什么关系?今天咱们一块儿来探究一番php

PHP处理器(PHP handlers)

首先须要记住的是,任何一种Web服务器(Apache、Nginx等)都是被设计成向用户发送html、图片等静态资源的,Web服务器自身并不能解释任何动态脚本(PHP、Python等)html

PHP处理器就是用来解释Web应用中的PHP代码,并将它解释为HTML或其余静态资源,而后将解析的结果传给Web服务器,最后再由Web服务器发送给用户web

大多数的Web服务器都不能解析PHP代码,所以它须要一个能解析PHP代码的程序,这就是PHP处理器编程

如今咱们知道了,Apache与Nginx都须要PHP处理器来处理php代码,那么怎么链接上服务器与php处理器呢?也就是说服务器与php处理器如何通讯?浏览器

答案是经过SAPI(Server Application Programming Interface 服务器端应用编程端口),简单来讲,SAPI指的是PHP具体应用的编程接口, 就像PC同样,不管安装哪些操做系统,只要知足了PC的接口规范均可以在PC上正常运行, PHP脚本要执行有不少种方式,经过Web服务器,或者直接在命令行下,也能够嵌入在其余程序中,有兴趣你们能够研究PHP内核服务器

咱们这里继续讨论PHP最经常使用的SAPI提供的2种链接方法:mod_php和mod_fastcgi架构

mod_php模式

我们回顾一下,Apache是怎么可以识别php代码的?是否是Apache的配置文件httpd.conf中加上或者修改这样几句:app

1
2
3
4
5
6
7
//添加
LoadModule php5_module modules/libphp5.so
AddType application/x-httpd-php .php
//修改
<IfModule dir_module>
   DirectoryIndex index.php index.html index.htm  index.html
</IfModule>

也即php做为Apache的一个子模块来运行,当经过web访问php文件时,Apache就会调用php5_module来解析php代码分布式

配置加载mod_php模块后,php即是Apahce进程自己一部分,每一个新的Apache子进程都会加载此模块性能

mod_fastcgi模式

咱们先看PHP-FPM官网的说明

PHP-FPM - A simple and robust FastCGI Process Manager for PHP
PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.

PHP-FPM是一个PHP的FastCGI进程管理器,解释的很是简单。这说明PHP-FPM是辅助mod_fastcgi模式进行工做的,然而FastCGI又是个什么东西?管理着什么进程?

什么是CGI?

CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位

CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程

CGI规范容许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体

说白了,CGI是一种外部应用程序(CGI程序)与Web服务器的协议,CGI是为了保证Server传递过来的数据是标准格式

什么是FastCGI?

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

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

通常状况下,FastCGI的整个工做流程是这样的:

  1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

  2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待WebServer的链接

  3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。 Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi

  4. FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成,FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个链接,在CGI模式中,php-cgi在此便已经退出

也就是说FastCGI是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序均可以经过FastCGI来提供Web服务

FastCGI的特色是会在一个进程中依次完成多个请求,以达到提升效率的目的,大多数FastCGI实现都会维护一个进程池

通俗解释:FastCGI事先就须要启动,并且能够启动多个CGI模块,在那里一直运行等着web发请求,而后再给php解析运算,完成后生成html返回给web后,可是完成后它不会退出,而是继续等着下一个web请求

PHP-FPM

PHP-FPM就是针对于PHP的FastCGI的一种实现,他负责管理一个进程池,来处理来自Web服务器的请求

可是PHP-FPM仅仅是个“PHP FastCGI 进程管理器”, 它仍会调用PHP解释器自己来处理请求,PHP解释器(在Windows下)就是php-cgi.exe

相关文章
相关标签/搜索