关于CGI&PHP-FPM的理解
2018-05-28 16:52:13 小德 访问次数 727

CGI是什么?

CGI全称 COMMON GATE INTERFACR ,通用网关接口,是网络服务器提供服务的接口协议,是网络服务器接收处理请求的标准。让浏览器HTTP可以想违背服务器请求数据。

FAST CGI是什么?

Fast CGI   Fast  COMMON GATE INTERFACR   理解为CGI的升级版。fastCGI 对比CGI 可以减少请求与服务器之间通信开销,提升服务器处理web请求的性能。

Key Point:CGI 和 FastCGI 是一种通信协议规范,不是一个实体 



PHP-FPM 是什么呢?

是一种fast-cgi 程序  不是CGI协议,是用fastCGI标准(协议)的程序,是协议的实现。


PHP-CGI 和 PHP-FPM的区别

php-cgi与php-fpm一样,也是一个fastcgi进程管理器,php-cgi的问题在于

1、php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启

2、直接杀死php-cgi进程,php就不能运行了。

3、(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。) 针对php-cgi的不足,php-fpm应运而生。

PHP-FPM 的管理对象是php-cgi。使用PHP-FPM来控制PHP-CGI的FastCGI进程

 

 

为什么推荐使用FastCGI程序

CGI程序运行在独立的进程中,对每个web请求建立一个进程,进程之间不能共享,大量的请求会导致大量的进程建立和销毁,从而是操作系统性能降低,此外地址空间无法共享也限制了资源重用。

FastCGI程序使用持续的进程来处理请求,这些进程由fastCGI服务器管理,指定活着的进程数量,实现请求之间进程共享。减少创建和销毁进程的开销。

 

Nginx 如何调用PHP

web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。

Key Point :  当web server收到/index.php这个请求后,会启动对应的CGI程序比如PHP-FPM,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。这里跟PHPzend引擎区分开来 ,zend引擎是识别PHP代码语法,解析语言本身的东西。跟HHVM一样的,让PHP文件所以为PHP文件。 

 

Apache如何调用PHP

Apache 有个mod_php 扩展。php是apache的一个外挂程序,必须依靠web服务器才可以运行。当客户端浏览器触发事件--->url 提交到apache服务器---->apache服务器根据php程序的特点判断是php程序,提交给php引擎程序--->php引擎程序解析并读取数据库生成相应的页面

 

 

FastCGI运行模式分析:

FastCGI的工作原理是:

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

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