PHP-FPM(FastCGI Process Manager)是如何管理PHP进程的

php-fpm 是专门为 PHP 提供的 FastCGI 进程管理器。
它负责:

  • 启动多个 PHP worker 进程;
  • 接收来自 Nginx(或其他 Web 服务器)的请求;
  • 将请求交给 PHP 解释执行
  • 并把结果返回给 Web 服务器。

架构原理

graph LR
    A[Nginx] -- FastCGI协议 --> B[php-fpm Master]
    B --> C[Worker1]
    B --> D[Worker2]
    B --> E[Worker3]
    C --> F[PHP解释执行]
    D --> F
    E --> F

组件说明

  • Nginx:不直接执行 PHP,而是把 .php 请求交给 FastCGI(即 php-fpm)处理。
  • php-fpm master:负责进程管理(启动、回收、重启 worker)。
  • php-fpm worker:真正执行 PHP 脚本的进程。
  • FastCGI 协议:定义了 Web 服务器和应用程序之间的通信方式。

配置文件结构

主要配置文件通常在:

/etc/php-fpm.conf
/etc/php-fpm.d/www.conf

php-fpm.conf

主要负责全局管理,如日志路径、pid、用户、进程管理模式等。

1
2
3
4
[global]
pid = /run/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = yes

www.conf

这是“池”(pool)配置文件,每个 pool 可以独立运行在不同端口/用户下。

1
2
3
4
5
6
7
8
9
10
[www]
user = nginx # 权限
group = nginx
listen = /run/php-fpm/www.sock
listen.owner = nginx
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10

fpm模式详解

php-fpm 的进程管理(pm)模式非常关键:

模式 说明 适用场景
static 固定数量的 worker 高并发、资源充足的生产环境
dynamic 动态创建/销毁 worker 一般生产环境默认
ondemand 按需创建 worker,空闲超时销毁 低负载或资源有限环境

php-fpm与Nginx的配合

1
2
3
4
5
6
7
location ~ \.php$ {
root /var/www/html;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

⚠️ 注意:

  • fastcgi_pass 可使用 socket 或 TCP(127.0.0.1:9000);
  • socket 更快(本地通信),TCP 适合分布式部署。

常用管理命令

1
2
3
4
5
6
7
8
9
10
# 启动/停止/重启
systemctl start php-fpm
systemctl restart php-fpm
systemctl status php-fpm

# 测试配置
php-fpm -t

# 手动 reload(平滑重启)
kill -USR2 $(cat /run/php-fpm.pid)

性能优化

  1. 调整 pm 参数
    根据内存与负载计算合理的 pm.max_children

    1
    max_children = 可用内存 / 单个 PHP worker 平均占用内存
  2. 使用 socket 通信(单机性能优先)。

  3. 启用 OPcache,避免重复编译 PHP 代码。

  4. 监控 fpm-status 页面:

    1
    2
    3
    4
    5
    6
    7
    location ~ ^/(status|ping)$ {
    fastcgi_pass unix:/run/php-fpm/www.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    allow 127.0.0.1;
    deny all;
    }

    然后访问 http://127.0.0.1/status 查看实时 worker 使用情况。


总结

php-fpm PHP 的高性能进程池管理器,它让 Nginx 可以高效、并发地处理 PHP 请求,是现代 PHP 应用(如 WordPress、Laravel、Drupal)必备组件。