PHP-FPM(FastCGI Process Manager)是PHP FastCGI的进程管理工具,其核心功能是通过三种进程管理模式(static、dynamic、ondemand)管理Worker进程的生命周期,平衡服务器资源利用率与请求处理效率。这三种模式适用于不同服务器配置与业务场景,选择不当可能导致资源浪费、响应延迟或服务不可用。
核心机制:启动时一次性创建pm.max_children个Worker进程,进程生命周期与FPM主进程绑定,运行期间不会动态增减。1秒定时器仅用于统计空闲/活动进程数等状态信息,不触发进程调整。
配置参数:仅需设置pm.max_children(必填,决定最大Worker数量)。
优缺点:
pm.max_children设置过高,会导致内存浪费;若设置过低,无法应对突发高并发,可能引发502 Bad Gateway错误。核心机制:启动时创建pm.start_servers个Worker(最小空闲进程数),运行过程中根据负载动态调整:
pm.min_spare_servers,按公式num = min(max_children - active_workers, (max_spare - current_spare)/2)创建新进程;pm.max_spare_servers,优先终止闲置时间最长的Worker。pm.max_children(最大Worker数)、pm.start_servers(启动时Worker数)、pm.min_spare_servers(最小空闲Worker数)、pm.max_spare_servers(最大空闲Worker数)。核心机制:启动时不创建任何Worker,仅在收到请求时通过fork()+exec()创建新进程;空闲进程超过pm.process_idle_timeout(默认10秒)后自动终止,若长时间无请求,仅保留主进程。
配置参数:需设置pm.max_children(最大Worker数)、pm.process_idle_timeout(空闲进程超时时间);PHP 8.3新增pm.ondemand_preload参数,可预加载框架核心类库到内存,减少首次请求延迟。
优缺点:
pm.max_requests(进程重启前处理请求数)配置,内存泄漏风险较高。pm.static_prefork=1,支持Worker进程并行预生成,加速服务启动;设置pm.max_children=CPU核心数×2(CPU密集型)或CPU核心数×4~8(IO密集型),结合pm.max_requests=1000~5000防止内存泄漏。pm.start_servers=(pm.min_spare_servers + pm.max_spare_servers)/2,避免初始进程数过多或过少;开启pm.max_requests=500~1000,定期重启Worker释放内存;电商大促场景提前2小时扩容pm.max_spare_servers,应对瞬时流量。pm.ondemand_preload=1,预加载框架核心类库(如Laravel、Symfony),减少首次请求延迟;设置pm.process_idle_timeout=5~10s,平衡内存占用与请求延迟;低配服务器限制pm.max_children=auto(根据内存动态计算),避免进程数过多导致系统崩溃。