€0.00 — free as in speechtonight's forecast: clear skies over production Cache: warm · Deploys: fair, 0% rollbacks expectedset by moonlight, shipped before dawn · deploy freely Page A2

The Daily Commit The Nightly Build

Dev news, typeset daily — PHP · AI · The Wider Stack

The developer's evening paper — PHP · AI · The Wider Stack

Wednesday, September 9, 2026 Vol. I — No. 511 · Morning editionLate edition EN DE FR ES

PHP · Releases

FrankenPHP 1.12.7 Fixes Lost Output After finish_request()

FrankenPHP 1.12.7 is out.

curated by Sönke

The patch release fixes a classic-mode bug where output sent after fastcgi_finish_request() was silently dropped, corrects a thread-count metric, tones down client-disconnect logging, and removes an opcache restart hook that could trigger recursive restarts.

FrankenPHP 1.12.7 Fixes Lost Output After finish_request()
Screenshot: FrankenPHP Releases ↗

FrankenPHP 1.12.7 shipped on 7 August, addressing five bugs and one documentation gap.

The main fix covers classic, non-worker mode. Previously, any output written after a script called fastcgi_finish_request() or frankenphp_finish_request() vanished without warning. Because ignore_user_abort defaults to on, the runtime treated a later echo as proof the client had disconnected, then stopped the script partway through. Kévin Dunglas closed this in pull request #2569, resolving issue #2548.

First-time contributor @ousamabenyounes tackled a metrics bug: frankenphp_total_threads kept accumulating rather than reporting the live thread count, so the number climbed indefinitely. It now behaves as a proper gauge (#2550, fixes #2481).

@AlliBalliBaba pulled the opcache-invalidation restart hook back out. Triggering a restart on every opcache reset risked runaway recursive restarts in frameworks that invalidate their cache often (#2564).

Dunglas also lowered the log level for routine client-disconnect write and flush errors, from warn to debug, aligning FrankenPHP with how Caddy and Mercure already handle these events. The messages no longer carry the incorrect "not a flusher" label (#2589).

On the build side, @henderkes updated go.sh to respect the PHP_CONFIG environment variable (#2557). The documentation gained an explanation of why the wait after a forced kill must remain unbounded (#2577).

See the full changelog from v1.12.6 to v1.12.7 on GitHub.

Read the original source ↗

Rate this article: 0

Readers’ Forum

No contributions yet — open the debate.

The Daily CommitThe Nightly Build — Page A1