网站首页 文章专栏 php-fpm是什么

php-fpm是什么

编辑时间:2020-09-08 09:15:40 作者:苹果 浏览量:2731


    前言:php-fpm作为安装php时,必会安装的一个扩展,居然一直没去研究过它的原理,赶紧补一下。



官方文档是这么说的:   https://www.php.net/manual/zh/install.fpm.php


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


它的功能包括:


1.支持平滑停止/启动的高级进程管理功能;


2.可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);


3.stdout 和 stderr 日志记录;


4.在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;


5.文件上传优化支持;


6."慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;


7.astcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);


8.动态/静态子进程产生;


9.基本 SAPI 运行状态信息(类似Apache的 mod_status);


10.基于 php.ini 的配置文件。



要理解官方的描述,有点难,特意查阅资料整理下:


先明白两个概念  web server 和 CGI

web server:当Webserver接收到一个HTTP请求,会返回一个HTTP响应,比如送回一个HTML页面。为了处理一个请求Webserver能够响应一个静态页面或图片,进行页面跳转或者把动态响应的产生托付给一些其他的程序比如CGI脚本,JSP脚本,servlets,ASP脚本,server端JavaScript,或者一些其他的server端技术。不管它们的目的怎样,这些server端的程序通常产生一个HTML的响应来让浏览器能够浏览


cgi:CGI程序又叫做“通用网关接口”,就是让Web服务器和你的应用程序进行交互的一个接口。就像nginx中需要配置的fastcgi_pass,一般我们会使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock来配置这个参数。它的意思就是告诉nginx,过来的请求使用tcp:9000端口的监听程序来处理或者使用unix/socket来处理。它们都是指向的PHP运行程序


简单的说:web server 是请求的分发者;CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。



FastCGI 顾名思义,是 CGI 的升级版本,为了提升 CGI 的性能而生,CGI 针对每个 HTTP 请求都会 fork 一个新进程来进行处理(解析配置文件php.ini、初始化执行环境、处理请求),然后把这个进程处理完的结果通过 Web 服务器转发给用户,刚刚 fork 的新进程也随之退出,如果下次用户再请求动态资源,那么 Web 服务器又再次 fork 一个新进程,如此周而复始循环往复。


而 FastCGIFpm 是一种多进程模型,它由一个 master 进程和多个 worker 进程组成master,进程启动时会创建一个 socket,但是不会接收、处理请求,而是由 fork 出的 worker 子进程完成请求的接收及处理。接收一个请求时, 它会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源。

这样一来,PHP-FPM 就好理解了,FastCGI 只是一个协议规范,需要每个语言具体去实现,PHP-FPM 就是 PHP 版本的 FastCGI 协议实现,有了它,就是实现 PHP 脚本与 Web 服务器(通常是 Nginx)之间的通信,同时它也是一个 PHP SAPI,从而构建起 PHP 解释器与 Web 服务器之间的桥梁。


一般情况下,FastCGI的整个工作流程是这样的:


1. Web服务器启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module或Ningx Fastcgi)。


2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(如果使用php-fpm管理器可见多个php-fpm进程)并等待来自Web服务器的连接。


3. 当客户端请求到达Web服务器时,Web FastCGI进程管理器选择并通过socket连接到一个CGI解释器,Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-fpm进程。


4. FastCGI子进程完成处理后将标准输出和错误信息从同一socket连接返回Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。而在CGI模式中,php-cgi进程在此便退出了。




nginx的php 配置总有这么一段:


location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000; #nginx fastcgi进程监听的IP地址和端口
            fastcgi_index  index.php;
            #Nginx默认获取不到PATH_INFO的值,得通过fastcgi_split_path_info指定定义的正则表达式来给$fastcgi_path_info(第二次捕获的,.php后面那截)和$fastcgi_script_name(第一次捕获的)
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;             ##加载nginx的fastcgi模块
        }



nginx通过fastcgi_pass来运行php $nginx_root(nginx配置文件中网站根目录root配置)下的index.php 文件(一般用作项目的入口文件)




现在回过头来解析官方文档:

1.支持平滑停止/启动的高级进程管理功能:

修改配置文件php.ini之后,php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

2.可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置):

基于cig原有的功能可以再配置一个不同端口

3.stdout 和 stderr 日志记录:

stdout:标准输出; stderr:标准错误输出;一般程序都会带有

4.在发生意外情况的时候能够重新启动并缓存被破坏的 opcode:

因为PHP-FPM是一个内置了php解释器的FastCGI服务,启动时能够自行读取php.ini配置和php-fpm.conf配置,opcode是php解析器的产物。opcode是什么?详见:https://linuxeye.com/361.html《opcode原理》

5.文件上传优化支持:

详见:《php-fpm配置与优化》

6."慢日志" :

如果一个php网站可以访问,就是访问速度变慢了,可以通过php-fpm的慢执行日志,清晰的了解到php的脚本哪里执行时间长,它可以定位到具体的代码行

7.astcgi_finish_request():

类似于异步处理,在调用方法的时候,会发送响应,关闭连接,但是不会结束PHP的运行。这个函数只在FastCGI模式下存在。

8.动态/静态子进程产生:

这个可以在php-fpm的配置文件中配置,详见:《php-fpm配置与优化》

9.基本 SAPI 运行状态信息:

SAPI: Server Application Programming Interface 的首字母缩写,意思是服务器端应用编程接口。这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务服务器与编程语言之间交互的接口。比如Linux命令行执行一段PHP代码,其实是Linux shell通过PHP SAPI传入一组参数,zend引擎执行后返回给shell。PHP 中实现的 SAPI 有很多,Cli、Fpm 是我们比较常见的。


10.基于 php.ini 的配置文件:

php.ini是PHP解析器的配置文件,启动php-fpmd第一步就是解析配置文件php.ini、初始化执行环境。毕竟php.ini是PHP的运行核心,决定php语言运行的环境、支持扩展的模块以及开发环境的配置,而PHP-FPM是php的进程管理器罢了。


那PHP-FPM又是什么呢?

答:fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯。而PHP-FPM是一个实现了Fastcgi的PHP专用程序,被PHP官方收了。

PHP在 5.3.3 之后已经讲php-fpm写入php源码核心了,不需要另外下载了,5.3.3之前需要自己下载安装的。


PHP-FPM 负责管理一个进程池来处理来自 Web 服务器的 HTTP 动态请求,在 PHP-FPM 中,master 进程负责与 Web 服务器进行通信,接收 HTTP 请求,再将请求转发给 worker 进程进行处理,worker 进程主要负责动态执行 PHP 代码,处理完成后,将处理结果返回给 Web 服务器,再由 Web 服务器将结果发送给客户端。这就是 PHP-FPM 的基本工作原理。


    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论