Day 9: Scaling with FrankenPHP: Implementing Caddy-based PHP runners

Designing and Building a High-Scale PHP Content Management System ~7 min read 60 min hands-on

Scaling with FrankenPHP: Implementing Caddy-based PHP Runners (Day 9)

Welcome back, fellow architects and engineers! In our journey to build a high-scale PHP Content Management System, we've dissected the fundamental challenge of state safety in long-living processes (Day 4). Today, we're going to put that understanding into action by embracing a game-changing technology that fundamentally alters how PHP applications scale: FrankenPHP, powered by Caddy.

Forget everything you thought you knew about PHP deployments involving Nginx and PHP-FPM for a moment. That model, while robust, carries a hidden "bootload tax" – the overhead of initializing the PHP interpreter, loading frameworks, and connecting to databases on every single request. At 100 million requests per second, this tax isn't just significant; it's crippling.

The Paradigm Shift: PHP as a Persistent Application Server

This is where FrankenPHP steps in. Built on the Caddy web server, FrankenPHP allows you to run your PHP application as a long-lived process, much like Node.js, Go, or Java application servers. Instead of booting up PHP for each request, a single FrankenPHP process stays alive, ready to serve subsequent requests instantly.

Core Concept: Application Server Emulation for PHP

Think of FrankenPHP as transforming your traditional PHP script into a persistent application server. This isn't just a minor optimization; it's a fundamental shift in architecture.

  1. Reduced Bootload Tax: The PHP interpreter, your framework (Laravel, Symfony, etc.), and initial database connections are loaded once and reused across thousands, even millions, of requests. This dramatically slashes per-request latency and CPU cycles.

  2. Persistent Connections: Database connections, Redis connections, and other external service connections can be kept alive and reused, eliminating the overhead of re-establishing them for every request. This is crucial for high-throughput systems.

  3. Caddy's Superpowers: FrankenPHP leverages Caddy's incredible capabilities:

  • Automatic HTTPS: Caddy manages TLS certificates for you, securing your CMS with zero configuration.

  • HTTP/3 Support: Out-of-the-box support for the latest HTTP protocol, offering lower latency and better performance, especially on lossy networks.

  • Graceful Reloads: Caddy can reload its configuration or update FrankenPHP processes without dropping active connections, ensuring continuous availability.

  • Unified Binary: Caddy and FrankenPHP are often compiled into a single static binary, simplifying deployment and reducing attack surface.

How FrankenPHP and Caddy Fit into Your High-Scale CMS

In our high-scale CMS, FrankenPHP becomes the workhorse. Instead of a complex setup with Nginx proxying to FPM pools, you'll have Caddy directly running your PHP application. Multiple FrankenPHP instances can run behind a load balancer (like another Caddy instance, HAProxy, or a cloud load balancer) to handle immense traffic.

Keep going with the full lesson

The rest of this lesson — plus its implementation guide, runnable scripts and source code — is included with the course or an All Access plan. Create a free account to start the free lessons in every course.

Already a member? Sign in