php-fpm fastcgi 工作原理以及优缺点

什么是 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-fpm 用户
    ps aux | grep php-fpm
    # 查看 php-fpm 进程 pid
    ps -ef | grep php-fpm
    # 启动 php-fpm
    php-fpm -D
    # 关闭 php-fpm
    kill -INT [pid]
    # 重启 php-fpm
    

     

总结

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值