A developer working on Teradion, practice management software for French accounting firms, migrated a Symfony application from nginx plus PHP-FPM to FrankenPHP in worker mode. The measured result, recalled from memory rather than formal benchmarks, was about a 20% improvement — far from the 3.5x figure promoted on the FrankenPHP homepage. The application spends most of its time pulling filings and deadlines from six external systems.

Digging into the 3.5x claim, the author found no published methodology. The benchmarks in the demo repository date from October 2022, measure latency at low load with a sleep in the script, include no RPS figure, and actually show classic mode slower than FPM. GitHub issue #481 requesting reproducible benchmarks has been open since January 2024.

A Tideways comparison from September 2025 reframed expectations: with a published methodology using a Hetzner CCX33 and Vegeta, it found essentially no performance or throughput difference between PHP-FPM and FrankenPHP in classic mode. The author's conclusion: gains come from the worker mode not rebooting the application on every request, not from the server itself. Simply swapping nginx for Caddy while staying in classic mode achieves nothing.

Several pitfalls cost time. After the switch, many files ended up with 0600 permissions — including the JWT private key — causing login failures with silent logs. A systemd runtime environment variable required doubled backslashes in Environment directives; single backslashes are rejected, and EnvironmentFile strips them, contradicting the official documentation, which prevented the worker from booting.

The most damaging issue was state surviving between requests: a filter leaked from one request into the next and intermittently broke logins. This is documented behavior — FrankenPHP states that static state persists by design and $_ENV is not reset, and Symfony warns that state captured by the kernel or services may leak unless services implement ResetInterface. Debugging was prolonged by PrivateTmp hiding logs written to /tmp, and by getSubscribedEvents being compiled, so restarts had no effect until the cache was cleared.

Despite the modest speed gain, the author considers the migration worthwhile for operational simplicity: one binary and one config instead of nginx plus php-fpm, and no more certificate management. Even the Tideways article notes FrankenPHP can reduce operations complexity. The author notes finding no public production case study with real figures and invites others to share theirs.