Roadmap - crazy-goat/php-fpm-ng GitHub Wiki
Roadmap (main)
Goal: a stable, usable release of php-fpm-ng on main. The async branch is separate (see Async Plan).
Deployment target: the gateway pool mostly runs behind a reverse proxy, sometimes directly exposed. Hardening covers both.
| Milestone | Theme | Contents |
|---|---|---|
| v0.13.0 (released 2026-10-03, notes) | Minimal php-src patches, gateway hardening, CI and packaging | Patch removal (#589, #590, #591, #592, #575); gateway fixes (#594, #595, #533, #534, #593, #537); flaky tests and CI (#567, #527, #544, #569); package license text (#581); #561; package gate pins skips by name (#678) |
| v0.14.0 (released 2026-10-03, notes) | Backpressure, docs truth, framework coverage, fd-exhaustion safety | #596 (#688 closed as solved by it; default http.response_buffer = 1M kept by owner decision), #687, #601, #602, #645, #639, #665, #676, #586, #584, #583, #545, #398, #674, #695 |
| v0.15.0 | Packaging, php-fpm-ng serve (plan) |
#425, #429, #430, #431, #728; package gate debugging #669, #679; flaky test #743 |
| v0.16.0 | Gateway graceful drain, correct failure responses, safe reload, selective-reload fixes | #641 (headline), #630, #604, #605, #636, #637, #635, #681, #638, #640, #631, #690, #691, #625, #735, #729, #716, #705, #738 |
| v0.17.0 | Operations: sd_notify, readiness, listener handoff, connection caps, metrics | #643, #646, #661, #686, #644, #642, #629, #667, #668, #692, #671, #683, #727, #734, #706, #652 |
| v0.18.0 | Gateway and static-file features | #658, #659, #651, #650, #649, #648, #628, #736 |
| v0.19.0 | Distribution and measurement | #653, #647, #656, #719, #657, #254 |
| backlog | Not planned yet (no milestone) | decisions #722-#726 (reconsider later); #654 (after #664 conditions, v0.18.0 at the earliest), #655, #660; chores/docs/tests #580, #585, #632, #675, #699, #700, #702, #707, #720, #739, #740, #741 |
Decisions
- 2026-10-03: drop php-src patches that main does not need (perf-only and dead ones: 0002-0005; 0001 GH-18956 is reported upstream and is removed if that does not break much).
- 2026-10-03: async-only code and tasks move to the
asyncmilestone and branch; main stays free of them. - 2026-10-03: #664 option 2: make
reload.selectivethe default one release after #631, #690, #691 and #692 ship (v0.18.0 at the earliest; implementation #654). - 2026-10-03: #663: no framework bridge until the worker executor leaves beta; then a userland bridge (#660) on top of C functions that return plain parameter arrays for Symfony HttpFoundation / PSR-7 / PSR-17, never objects.
- 2026-10-03: #662 option 2: Range (single range), Cache-Control by path prefix and precompressed sidecars, all opt-in (implementation #648).
- 2026-10-03: #191: no cross-worker wakeup for now (closed as not planned; reopen only on the #182 / #53 gates).
- 2026-10-03: triage of the 60 issues without milestone: v0.14.0 +8, v0.15.0 +2, new v0.16.0 (14) and v0.17.0 (12), the rest stays in backlog.
- 2026-10-03: async synced with main (#620, PR #708); v0.14.0 released. New: competitor gap analysis (Competitor-Gap-2026-10-03); reconsideration issues #722-#726, crash backoff #727,
php-fpm-ng serve#728 in v0.15.0 (default gateway -> fastcgi,--direct,--worker). - 2026-10-03: triage after v0.14.0: 5 bugs to v0.16.0, 4 to v0.17.0, #717 to async; new milestones v0.18.0 (gateway/static features) and v0.19.0 (distribution/measurement); decisions and low-priority chores stay in backlog.
- 2026-10-03: #657 TLS leave-beta pass stays in v0.19.0; prerequisite #254 (ACME staging on a real domain, owner has one) moves to v0.19.0.
- 2026-10-03: #628 filter underscore headers in getallheaders() too (v0.18.0); #647 official ghcr.io images, yes (v0.19.0); #662 and #663 closed, decisions recorded, implementation in #648 and #660.