FastCGI 和 PHP-FPM 及相关知识的介绍

我们平时可能经常看到FastCGI或者PHP-FPM,比如说我们在linux上安装php的时候,发现php必须要安装一个PHP-FPM这样的扩展,甚至现在PHP-FPM已经成了php的内核了。看了很多资料,还是整合一下,若有更好的见解,请及时提出!

什么是CGI?

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

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

之前我看见一篇文章里面对CGI解释的非常清楚,CGI是为了保证web server传递过来额数据是标准的,方便CGI程序的编写者。再解释的通俗点就是CGI是一个协议,具有无语言性!

什么是FastCGI?

看到这里,你可能有疑问,那为什么会出现FastCgi呢?其实CGI有一个令人诟病的地方,而FastCgi便是为了解决这个问题而诞生的,我这样来描述他们的区别:

我们应该清楚PHP解析器会解析php.ini文件,初始化执行环境,标准的CGI对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个请求的时间会比较长。这明显不合理嘛!那么FastCGI是怎么做的呢?首先,FastCGI会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是FastCGI的对进程的管理。
nice!这样就非常清楚了~

FastCGI的工作原理

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就是很大的内存数.

为何会出现PHP-FPM呢?

在了解php-fpm之前,其实必须得先了解php-cgi,what?这个又是什么鬼?其实很简单,php-cgi就是FastCGI的的管理器,他有一个明显的缺点,不支持平滑重启,也就是说每次修改php.ini文件,需要重启 php-cgi才生效!其次,一旦杀死php-cgi进程,php便不能运行了!

由此,便诞生了php-fpm,哈哈!终于来了解这个了~

PHP-FPM一开始只是一个php的补丁,我们要使用它,必须通过下载的形式,那么,自从php5.3.3之后,PHP-FPM便纳入了php的内核,不再作为补丁的形式来使用了,它的优势非常明显:

  • PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程
  • 可以平滑重载PHP配置
  • 比spawn-fcgi具有更多优点

总结

哇!看到这!你可能有点蒙,也可能拨云见日一般清晰明了了,其实这么多内容,之前看到一个人总结的很好,他是这样讲的: 注意!前方高能预警!

你(PHP)去和爱斯基摩人(web服务器,如 Apache、Nginx)谈生意

你说中文(PHP代码),他说爱斯基摩语(C代码),互相听不懂,怎么办?那就都把各自说的话转换成英语(FastCGI 协议)GI

怎么转换呢?你就要使用一个翻译机(PHP-FPM)
(当然对方也有一个翻译机,那个是他自带的)

我们这个翻译机是最新型的,老式的那个(PHP-CGI)被淘汰了。不过它(PHP-FPM)只有年轻人(Linux系统)会用,老头子们(Windows系统)不会摆弄它,只好继续用老式的那个。

哈哈!说的真是形象生动!这也印证了那句话,真理掌握在少数人手里!

本作品采用《CC 协议》,转载必须注明作者和本文链接
LaravelChen
本帖由系统于 5年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

@springjk 我觉得蛮有用的,哈哈!

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!