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 | [global] |
www.conf
这是“池”(pool)配置文件,每个 pool 可以独立运行在不同端口/用户下。
1 | [www] |
fpm模式详解
php-fpm 的进程管理(pm)模式非常关键:
| 模式 | 说明 | 适用场景 |
|---|---|---|
static |
固定数量的 worker | 高并发、资源充足的生产环境 |
dynamic |
动态创建/销毁 worker | 一般生产环境默认 |
ondemand |
按需创建 worker,空闲超时销毁 | 低负载或资源有限环境 |
php-fpm与Nginx的配合
1 | location ~ \.php$ { |
⚠️ 注意:
fastcgi_pass可使用 socket 或 TCP(127.0.0.1:9000);- socket 更快(本地通信),TCP 适合分布式部署。
常用管理命令
1 | # 启动/停止/重启 |
性能优化
调整 pm 参数:
根据内存与负载计算合理的pm.max_children。1
max_children = 可用内存 / 单个 PHP worker 平均占用内存
使用 socket 通信(单机性能优先)。
启用 OPcache,避免重复编译 PHP 代码。
监控 fpm-status 页面:
1
2
3
4
5
6
7location ~ ^/(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-fpmPHP 的高性能进程池管理器,它让 Nginx 可以高效、并发地处理 PHP 请求,是现代 PHP 应用(如 WordPress、Laravel、Drupal)必备组件。