商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > php中的fpm_详解PHP中PHP-FPM是什么?有什么用?

php中的fpm_详解PHP中PHP-FPM是什么?有什么用?

  发布于2026-07-20 阅读(0)

扫一扫,手机访问

PHP-FPM,全称是 PHP FastCGI Process Manager,也就是 PHP FastCGI 进程管理器。简单说,它是用来管理 PHP 进程池的,负责接收来自 Web 服务器的请求。

它的核心价值在于,提供了一套更高效的 PHP 进程管理机制。不仅能有效控制内存和进程的开销,还能实现 PHP 配置的平滑重载,这对线上环境来说至关重要。

为什么会有 PHP-FPM?

要理解 PHP-FPM,得先搞清楚它出现的背景。PHP-FPM 的出现,完全是为了应对 PHP-FastCGI 的管理需求。换句话说,它是为了管理好 PHP-FastCGI 而专门实现的一个程序。

那 PHP-FastCGI 又是什么?它本质上只是一个 CGI 程序,专门负责解析 PHP 请求并返回结果。它本身并不具备管理能力,所以才需要 PHP-FPM 来“搭把手”。

这里有个小插曲:为什么叫“PHP-FastCGI”,而不是直接叫“PHP-CGI”?因为在 PHP-FastCGI 出现之前,确实存在一个叫“PHP-CGI”的东西。但它的执行效率实在太低,很快就被 PHP-FastCGI 取代了。

说到这,问题就来了:FastCGI 和传统的 CGI,到底区别在哪?

区别可大了。当 Web 服务器(比如 Nginx)收到一个请求,通过文件后缀判断出这是一个动态 PHP 请求时,就会把它转交给 PHP 处理。

在 CGI 那个年代,思路比较保守。每次来一个请求,都得去读取 php.ini 里的基础配置,初始化执行环境,然后创建一个进程,处理完再退出。你可以想象一下,每次请求都要重复“创建进程→读取配置→初始化环境→返回数据→退出进程”这一整套流程。久而久之,这种“启动进程”的工作就变得异常乏味且沉重。

到了 PHP 5 的时代,大家对这个工作方式已经忍无可忍了。一些想“偷懒”的人开始琢磨:能不能让 CGI 只启动一次主进程(master),让它只读取一次配置,然后启动多个工作进程(worker)?这样,当请求来临时,由 master 分配给 worker 去处理,就能避免重复劳动了。于是,FastCGI 应运而生。

那么,FastCGI 启动的 worker 用完了怎么办?当 worker 不够用时,master 会根据配置中的信息,动态地启动新的 worker;等到空闲时,又可以把多余的 worker 回收掉。这种动态管理的机制,比传统的 CGI 高效太多。

到这里,应该能明白 PHP-FPM 到底是干什么的了。它就是一个管理程序,负责启动一个 master 进程和多个 worker 进程。PHP-FPM 会创建一个主进程,控制着何时以及如何将 HTTP 请求转发给一个或多个子进程处理。同时,主进程还掌管着 PHP 子进程的创建(应对更多流量)和销毁(进程运行太久或不再需要)。PHP-FPM 进程池中的每个进程,生命周期都比单个 HTTP 请求要长,可以处理 10、50、100、500 甚至更多的 HTTP 请求。

安装

自 PHP 5.3.3 起,PHP-FPM 已经被整合到 PHP 的核心代码中了。这意味着你不再需要单独下载安装 PHP-FPM。想让 PHP 支持 PHP-FPM,只需在编译 PHP 源码时加上 --enable-fpm 参数即可。

全局配置

在 CentOS 系统中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf

这里有一个实用的配置:可以指定在一段时间内,如果失效的 PHP-FPM 子进程数超过某个阈值,就让 PHP-FPM 主进程优雅重启。

emergency_restart_threshold = 10
emergency_restart_interval = 1m

其中,emergency_restart_threshold 设定的是失效子进程的阈值,emergency_restart_interval 则设定了这个统计的时间跨度。

配置进程池

PHP-FPM 配置文件的其余部分,是一个名为 “Pool Definitions” 的区域。这个区域用来配置每个 PHP-FPM 进程池。一个进程池中,包含一系列相关的 PHP 子进程。通常,一个 PHP 应用会拥有自己独立的进程池。

在 CentOS 中,PHP-FPM 主配置文件顶部会通过 include=/etc/php7/php-fpm.d/*.conf 引入进程池定义文件。

默认的进程池配置文件是 www.conf。其中几个关键配置项如下:

  • user = nobody:设置拥有该进程池中子进程的系统用户,必须设为非 root 用户。
  • group = nobody:设置拥有该进程池中子进程的系统用户组,同样需要设为非 root 用户所属的用户组。
  • listen = [::]:9000:进程池监听的 IP 地址和端口。Nginx 会将请求转发到这里。
  • listen.allowed_clients = 127.0.0.1:允许向该进程池发送请求的 IP 地址。
  • pm.max_children = 51:这个设置决定了进程池中最多能同时存在多少个进程。这个值没有绝对标准,需要根据实际应用来测试。通常,一个 PHP 进程会占用 5~15MB 内存。假设给这个进程池分配了 512MB 可用内存,那么 max_children 可以设置为 512MB / 10MB ≈ 51。

编辑保存后,需要重启 PHP-FPM 主进程:sudo systemctl restart php-fpm.service。更多进程池配置详情,可以参考官方文档。

参考 Company 开发环境

举个例子,测试环境的一个典型配置如下:

[www]
user = nobody
group = nobody
listen = [::]:9000
chdir = /app
pm = dynamic
pm.max_children = 16
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 16
catch_workers_output = Yes

这里解释一下几个关键参数:

  • pm = dynamic:选择进程管理器的模式。static 模式会锁死子进程数量,而 dynamic 模式则会根据以下参数动态调整。
  • pm.max_children:同一时刻存活的最大子进程数。
  • pm.start_servers:启动时创建的子进程数量。
  • pm.min_spare_servers:空闲状态的最小进程数。如果空闲进程数低于此值,会创建新的子进程。
  • pm.max_spare_servers:最大空闲进程数。如果空闲进程数超过此值,会杀掉多余的子进程。
  • catch_workers_output:将 worker 的标准输出和错误输出重定向到主错误日志。

转发请求给 PHP-FPM

以 Nginx 为例,配置转发请求到 PHP-FPM 的示例如下:

server {
    listen 83;
    server_name mobile.com;
    root /app/mobile/web/;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    location / {
        index index.html index.htm index.php;
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ .*\.php {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 192.168.33.30:9000;
        fastcgi_index index.php;
        try_files $uri =404;
    }
    location ~ /\.(ht|svn|git) {
        deny all;
    }
    access_log /app/wwwlogs/access.log;
    error_log /app/wwwlogs/error.log;
}

在这个配置中,Nginx 通过 fastcgi_pass 192.168.33.30:9000 将请求转发给监听在 9000 端口的 PHP-FPM 进程池。

PHP-FPM 启动、重启、终止操作

启动 PHP-FPM:/usr/sbin/php-fpm/usr/local/php/sbin/php-fpm

需要注意的是,PHP 5.3.3 之后的 PHP-FPM 不再支持 start|stop|reload 这类命令。推荐使用信号控制:

  • INT, TERM:立刻终止。
  • QUIT:平滑终止。
  • USR1:重新打开日志文件。
  • USR2:平滑重载所有 worker 进程,并重新载入配置和二进制模块。

一个简单的重启方法是:先通过 ps aux|grep php-fpm 找到 master 进程的 PID,然后执行 kill -USR2 [PID]。例如,如果 master 进程号为 42891,则执行 kill -USR2 42891

如果想更方便地管理,可以配置 pid 文件。在 /usr/local/php/etc/php-fpm.conf[global] 部分,找到 ;pid = run/php-fpm.pid,去掉注释,然后重启 PHP-FPM 即可生成 pid 文件。之后就可以使用以下命令来管理了:

  • 关闭:kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
  • 重启:kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'
本文转载于:https://blog.csdn.net/weixin_35651995/article/details/115104719 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注