php-fpm浅析

什么是php-fpm?官方解释版

  FPM(FastCGI 进程管理器)用于替换PHP FastCGI的大部分附加功能,对于高负载网站是非常有用的。它的功能包括:

  1. 支持平滑停止/启动的高级进程管理功能;
  2. 可以工作与不同的uid/gid/chroot环境下,并监听不同的端口和使用不同的php.ini配置文件(可取代safe_mode的设置);(注:gid为groupid,即组id,用来标识用户组的唯一标识符;uid为userid,即用户id,用来标识每个用户的唯一标示符。用户组:将同一类用户设置为同一组,如可将所有的系统管理员设置为admin组,便于分配权限,将某些重要的文件设置为所有admin组用户可以读写,这样可以进行权限分配,每个用户有一个唯一的用户id,每个用户组都有唯一的组id。charoot为change root,就是改变程序执行时所参考的根目录位置,可以增进系统的安全性,限制使用者能做的事。safe_mode是一种安全模式。)
  3. stdout和stderr日志记录。(注:在Linux下,当一个用户进程被创建的时候,系统会自动为该进程创建三个数据流,分别是标准输出、标准输入和标准错误,分别用stdout, stdin, stderr来表示。对于这三个数据流来说,默认是表现在用户终端上的,比如我们在c中使用fprintf;)
  4. 在发生意外情况的时候能够重新启动并缓存被破坏的opcode。(注:opcode为就是指令序列号,用来告诉CPU需要执行哪一条指令。英文OPERATING CODE,是php程序执行的最基本单位)
  5. 文件上传优化支持。
  6. 慢日志。(记录脚本运行所导致的异常缓慢,不仅记录文件名,还记录php backtrace信息)
  7. fastcgi_finish_request()。(用于在请求完成和刷新数据后,继续在后台执行耗时的工作)
  8. 动态、静态子进程产生。
  9. 基本ASPI运行状态信息(ASPI全称就是Advanced SCSI Programming Interface高级SCSI编程接口,大多数CD/DVD-ROM(如CD ripper,刻录软件、工具)软件都使用ASPI接口与驱动器通信)
  10. 基于php.ini 的配置文件

  以上解释,总的来说,php-fpm是一个FastCGI的进程管理器,用来管理FastCGI进程的。

什么是CGI?

  CGI (Common Gateway Interface)是Web Server与后台语言交互的协议,有了这个协议,开发者可以使用任何语言处理Web Server发来的请求,动态生成内容。保证了传递过来的数据是标准格式的(规定了以什么样的格式传哪些数据,比如url、post数据、http header等),方便了开发者。

什么是PHP-CGI? 

  PHP语言对应与服务器交互的CGI程序为PHP-CGI。CGI程序本身只能解析请求、返回结果,不会进程管理,就是说,每处理一个请求都需要fork一个全新的进程,即每一次web请求都会有启动和退出进程,也就是fork-and-execute模式,一旦高并发,很容易崩溃。于是出现了FastCGI。

什么是FastCGI?

  FastCGI,更快的CGI,它允许在一个进程内处理多个请求,而不是一个请求处理完毕就直接结束进程,性能上有了很大的提高。FastCGI可以说是一种协议。

FastCGI如何管理进程?

  首先,FastCGI启动一个master进程,解析配置文件,初始化执行环境,然后再启动多个worker进程。当请求过来时,master会传递一个给worker,然后立即可以接受下一个请求。当worker不够用时,master可以根据配置预先启动几个worker等着。当空闲的worker太多时,也会停掉一些。这样提高了性能也节约资源。

什么是PHP-FPM?

  FPM是一个PHP进程管理器,包含master进程和worker进程两种进程:master进程只有一个,负责监听端口,接受来自web server的请求。worker进程一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个php解释器,是PHP代码真正执行的地方。

FPM是怎么处理请求的?

  master进程接收到请求后,根据配置指派特定的worker进程进行处理请求,如果没有可用进程,返回错误,也就是我们遇到的502。worker进程处理请求,如果超时,则返回504。请求处理结束,返回结果。

Nginx如何发送请求给FPM?

  Nginx是一个web服务器,也是一个功能强大的proxy服务器(在线代理服务器),除了进行http请求的代理,还可以进行许多其他协议请求的代理,包括文本与FPM相关的FastCGI协议。为了使Nginx能够理解FastCGI协议,Nginx提供了FastCGI模块来将http请求映射为对应的FastCGI请求,该模块提供了fastcgi_param指令来处理这些映射关系,如下图的配置文件,可以将Nginx中的变量翻译成PHP中能够理解的变量。 

 

 除此之外,还有fastcgi_pass指令,用于指定FPM进程监听的地址,Nginx会把所有的php请求翻译成FastCGI后再发送到这个地址,如以下Nginx配置文件

 

   在这个配置文件中,新建的虚拟主机www.example.com监听80端口,项目根目录为/usr/local/web/Mr_J/public,通过location指令,将所有以.php结尾的请求都交给FastCGI模块处理,从而把所有的PHP请求都交给了fpm处理,从而完成了Nginx到fpm的闭环。Nginx与fpm的通信流程如下

 

posted @ 2020-03-30 21:09  smallzhen  阅读(458)  评论(0编辑  收藏  举报