Observed worker state inconsistencies under Apache mod_proxy_fcgi with connection reuse (PHP-FPM 8.5.6)
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.1k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
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
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par reproduire le comportement avec PHP-FPM 8.5.7, Apache mod_proxy_fcgi, des sockets Unix et les configurations minimale et optimisée décrites ici. Comparez les états des workers dans /fpm-status avec les observations externes et déterminez si l’écart se situe dans les transitions des requêtes de PHP-FPM ou dans la réutilisation des connexions Apache ; le travail est terminé lorsqu’une cause confirmée et un test de régression ciblé ou un correctif reproductible sont disponibles.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- apache, php
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- Calme
- Clarté
- À clarifier
- Accessibilité débutants
- 38/100