发布于2026-07-20 阅读(0)
扫一扫,手机访问
PHP-FPM,全称是 PHP FastCGI Process Manager,也就是 PHP FastCGI 进程管理器。简单说,它是用来管理 PHP 进程池的,负责接收来自 Web 服务器的请求。
它的核心价值在于,提供了一套更高效的 PHP 进程管理机制。不仅能有效控制内存和进程的开销,还能实现 PHP 配置的平滑重载,这对线上环境来说至关重要。
要理解 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。更多进程池配置详情,可以参考官方文档。
举个例子,测试环境的一个典型配置如下:
[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 的标准输出和错误输出重定向到主错误日志。以 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:/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'
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8