Observed worker state inconsistencies under Apache mod_proxy_fcgi with connection reuse (PHP-FPM 8.5.6)
还没有人认领这个 Issue。
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.1k
- 平均合并
- 2 天 13 小时
- 30 天内合并 PR
- 96
描述
Description
Environment
- PHP-FPM: 8.5.6
- Process manager:
pm = dynamic - Typical pool configuration:
pm.max_childrendefined (value respected and stable)pm.start_servers,pm.min_spare_servers,pm.max_spare_serversstandard tuningpm.max_requests = 500
- Backend: Apache HTTP Server
- FastCGI handler:
mod_proxy_fcgi - Transport: Unix socket
- Relevant proxy configuration:
<Proxy "fcgi://handler/" enablereuse=on flushpackets=on max=10>
Additional working configuration (mitigating issue)
The following configuration appears to resolve or significantly reduce the observed behavior:
<Proxy "fcgi://handler/" enablereuse=on flushpackets=auto smax=2 max=12 acquire=1000 ttl=10 timeout=60 connectiontimeout=300ms>
Observed behavior (problematic configuration)
When using the simplified proxy configuration with connection reuse enabled:
- Workers in PHP-FPM appear to remain in intermediate states such as
reading headerslonger than expected. /fpm-statusshows discrepancies in perceived worker activity (notably higher "active" states than expected based on external observation).- Idle/spare worker management appears delayed or not aligned with expected request completion cycles.
max_spare_serversbehavior appears inconsistent with expected worker availability under idle load conditions.- The issue is reproducible and deterministic under sustained use of persistent FastCGI connection reuse.
Observed behavior (tuned configuration)
With explicit tuning of Apache FastCGI proxy pooling parameters:
- Worker state transitions appear consistent and timely.
- Idle/spare worker management behaves as expected.
- No persistent
reading headersstate anomalies observed. /fpm-statusmetrics appear stable and consistent with external process observation.
Notes on reproducibility
- Issue is reproducible under Apache
mod_proxy_fcgionly with:enablereuse=on- minimal or default proxy pool tuning
- Behavior changes significantly when introducing:
ttlacquireconnectiontimeout- constrained pool size (
smax,max)
Hypothesis (not confirmed)
It is not confirmed whether this behavior is caused by:
- PHP-FPM internal worker state machine handling
- Apache
mod_proxy_fcgiconnection reuse behavior - Interaction between FastCGI persistent connections and request lifecycle completion signaling
However, the observed behavior suggests a possible desynchronization between:
- actual request completion at PHP execution level
- worker state transition to idle within PHP-FPM
- FastCGI connection reuse lifecycle on the proxy side
Relation to /fpm-status discrepancies
It is not confirmed whether this issue is directly related to known discrepancies observed in /fpm-status (e.g. inconsistencies in reported active worker counts under certain conditions).
However, both phenomena share a common dependency on:
- worker state transition timing
- FastCGI connection reuse behavior
- request lifecycle completion signaling (
reading headers/ transition states)
This suggests a possible shared underlying factor, although no direct causality is claimed.
Important clarification
This report is based on observations from an Apache + PHP-FPM setup. Equivalent behavior under Nginx has not been directly evaluated in this context, although similar FastCGI reuse patterns may be relevant.
Summary
- Reproducible worker state inconsistencies observed under Apache
mod_proxy_fcgiwith connection reuse enabled. - Behavior strongly influenced by proxy connection pooling parameters.
- Mitigation achieved via explicit tuning of reuse, TTL, and connection limits.
- Root cause not confirmed; likely interaction between FastCGI reuse lifecycle and PHP-FPM worker state transitions.
- Possible, but unconfirmed, relation to
/fpm-statusinconsistencies.
PHP Version
PHP 8.5.7 (cli) (built: Jun 10 2026 20:19:22) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.5.7, Copyright (c) Zend Technologies
with Zend OPcache v8.5.7, Copyright (c), by Zend Technologies
Operating System
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先,使用 PHP-FPM 8.5.7、Apache mod_proxy_fcgi、Unix 套接字,以及此处所述的最小 配置和调优后的 配置来复现该行为。将 /fpm-status 中的 worker 状态与外部观测结果进行比较,并确定差异究竟出在 PHP-FPM 的请求状态转换,还是出在 Apache 的连接复用上;完成的标准是确认原因,并提供一个有针对性的回归测试或可复现的修复。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- apache, php
- 领域
- backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 冷清
- 描述清晰度
- 需要澄清
- 新手友好度
- 38/100