php-cgi和php-fpm有什么关系?

php-cgi是fastcgi 的进程管理器
php-fpm 也是fastcgi的进程管理器

那么php-fpm和php-cgi 有什么关系呢。

阅读 15.3k
4 个回答

php-cgi是早期php官方出品的fastcgi管理器,不支持平滑重启,改了php.ini就要kill掉原来的php-cgi再重新启动才能生效;不支持动态worker调度,只能一开始指定要起几个worker。

php-fpm是从5.3.3才加入的fastcgi进程管理器,加入了动态调度功能,可以根据请求来访压力变化动态增减worker进程数量;支持reload指令,让worker进程在完成当前请求后重启,并应用php.ini新配置。

转一个有助理解的共同学习

clipboard.png

clipboard.png

webapp即是PHP解析器等

Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了,

  • CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。

  • FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。

  • PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI
    协议的接口程序。

  • PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。


WEB 中

  • Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,

  • Web Application 一般指PHP、Java、Asp.net等应用程序。

clipboard.png

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

  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在此便退出了。


FastCGI与CGI特点:

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

由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
升级:

clipboard.png

  • php-fpm即php-Fastcgi Process Manager.

  • php-fpm是 FastCGI 的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。

master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

理解CGI

CGI是公共网关接口,是网站服务器进程经过操作系统和互联网客户端进行通讯的一套规范标准。

通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,如果用户请求的是静态资源,则CGI直接将静态资源返回,如果用户请求的是php程序,则CGI将php程序运行的结果返回给用户。

CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。

WEB服务器在接收到请求后,执行步骤是:

WEB服务器在接收到请求后,如果请求的是静态资源,则返回静态资源。
WEB服务器在接收到请求后,如果请求的是动态资源,先要创建cgi的子进程,激活一个CGI进程。
如果是php请求,这个CGI进程就是php解析器。
php解析器会去解析php.ini配置文件,初始化执行环境。
然后执行请求的文件,返回处理结果,并退出进程。
WEB服务器再将结果返回给浏览器。

以上的3-5的过程就是CGI需要处理的任务。

那么问题来了。服务器没接受到一次动态资源的请求,服务器就要去创建一个CGI进程,加载php配置文件,初始化执行环境。当用户请求量大的时候,会大量挤占系统资源。这就是为什么要出现fastCGI。
理解fastCGI

fastCGI是CGI的升级版本,FastCGI像是一个常驻(long-live)型的CGI。

那么fastcgi是怎么做的呢?首次,fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。 当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。

补充说明:PHP-CGI是PHP自带的FastCGI管理器。

优点:

从稳定性上看,fastCGI是以独立的进程池来运行CGI,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑;
从安全性上看,fastCGI支持分布式运算。fastCGI和宿主的Server完全独立,fastCGI怎么down也不会把Server搞垮;
从性能上看,fastCGI把动态逻辑的处理从Server中分离出来,大负荷的IO处理还是留给宿主Server,这样宿主Server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分,大量的是图片等静态。

但同样问题来了,因为fastCGI已经事先把php的配置文件加载到执行环境中。那么我们更改了配置文件后,在重启服务器时,就必须把现有的所有worker进程全部杀死,然后重新启动服务。这样服务器就不能平滑重启了,php-fpm就是为了解决这个问题。
理解php-fpm

PHP-FPM是一个PHP FastCGI管理器。原先,PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。

那么它是怎么做到平滑重启的呢?php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

这是我博客的原文。
http://fooklook.com/blog/phpn...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏