PHP-FPM(PHP FastCGI Process Manager)是一个用于管理 PHP 脚本执行的进程管理器,特别适用于高负载网站。它提供了一些额外的功能来提高 PHP 的性能和稳定性,如进程管理、日志记录、慢请求跟踪等。以下是对 PHP-FPM 进程的一些说明:
1. 主进程(Master Process)
- 职责:负责启动、停止和管理所有的子进程。
- 权限:通常以 root 权限运行,以便绑定到低编号端口(如80),然后降权运行子进程。
- 配置文件:读取并解析主配置文件(通常为
/etc/php-fpm.conf或/etc/php-fpm.d/*.conf)。
2. 子进程(Worker Processes)
- 职责:实际处理传入的 PHP 请求。
- 数量:可以通过配置文件中的
pm.max_children参数来设置最大子进程数。 - 生命周期:由主进程创建和销毁,根据负载情况动态调整。
3. 配置参数
PHP-FPM 的配置文件中有许多参数可以调节其行为,以下是一些常用参数:
主配置文件参数
pid: 指定主进程的 PID 文件路径。error_log: 错误日志文件路径。
池(Pool)配置参数
每个池都有自己的配置文件,通常位于 /etc/php-fpm.d/ 目录下,每个池可以有不同的设置。
listen: 指定监听地址和端口,例如127.0.0.1:9000或 Unix 套接字/var/run/php-fpm.sock。user和group: 指定子进程运行的用户和组。pm: 进程管理模式,可以是static,dynamic, 或ondemand。static: 固定数量的子进程,由pm.max_children决定。dynamic: 动态调整子进程数量,根据负载情况在pm.min_spare_servers和pm.max_spare_servers之间变化,并且总数不超过pm.max_children。ondemand: 按需启动子进程,当没有请求时会终止所有子进程,最小数量由pm.process_idle_timeout决定。
pm.max_children: 最大子进程数。pm.start_servers: 启动时创建的子进程数,仅在动态模式下有效。pm.min_spare_servers: 保持最小空闲子进程数,仅在动态模式下有效。pm.max_spare_servers: 保持最大空闲子进程数,仅在动态模式下有效。slowlog: 慢请求日志文件路径,用于记录超过指定时间的慢请求。
4. 日志
PHP-FPM 提供了多种日志记录方式:
- 错误日志:记录 PHP-FPM 自身的错误信息,由主配置文件中的
error_log参数指定路径。 - 访问日志:记录每个请求的信息,可以通过池配置中的
access.log参数指定路径。 - 慢请求日志:用于追踪执行时间过长的脚本,由池配置中的
slowlog参数指定路径,并配合使用参数request_slowlog_timeout设置超时时间。
5. 信号处理
PHP-FPM 主进程可以通过接收不同的信号来进行控制:
- SIGTERM: 优雅地关闭所有子进程并退出主进程。
- SIGINT: 与 SIGTERM 类似,优雅地关闭所有子进程并退出主进程。
- SIGQUIT: 快速关闭所有子进程并退出主进程,不等待正在处理的请求完成。
- SIGHUP: 重载配置文件并优雅地重启所有子进程。
通过合理配置和优化 PHP-FPM,可以显著提升 PHP 应用程序的性能和稳定性。
