--- name: frankenphp description: FrankenPHP Documentation - Modern PHP application server built on Caddy --- # FrankenPHP Skill Comprehensive assistance with FrankenPHP development - a modern PHP application server built on top of the Caddy web server. FrankenPHP enables persistent PHP processes with worker mode, automatic HTTPS, HTTP/2, HTTP/3, and real-time capabilities via Mercure integration. ## When to Use This Skill This skill should be triggered when: - Setting up or configuring FrankenPHP server - Implementing FrankenPHP worker mode for performance optimization - Integrating FrankenPHP with Laravel, Symfony, or other PHP frameworks - Deploying PHP applications with Docker using FrankenPHP - Converting traditional PHP apps to use persistent workers - Configuring automatic HTTPS, HTTP/2, or HTTP/3 - Implementing real-time features with Mercure - Creating standalone, self-executable PHP applications - Optimizing PHP application performance with persistent processes - Troubleshooting FrankenPHP worker mode or configuration issues ## Quick Reference ### Installation & Basic Server **Install via curl (Linux/macOS):** ```bash curl https://frankenphp.dev/install.sh | sh mv frankenphp /usr/local/bin/ # Start server in current directory frankenphp php-server ``` **Install via Homebrew:** ```bash brew install dunglas/frankenphp/frankenphp frankenphp php-server ``` **Quick Docker deployment:** ```bash docker run -v $PWD:/app/public \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp ``` ### Basic Worker Mode **Start worker with standalone binary:** ```bash frankenphp php-server --worker /path/to/your/worker/script.php ``` **Docker with worker mode:** ```bash docker run \ -e FRANKENPHP_CONFIG="worker /app/public/index.php" \ -v $PWD:/app \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp ``` **Worker with 42 processes:** ```bash docker run \ -e FRANKENPHP_CONFIG="worker ./public/index.php 42" \ -v $PWD:/app \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp ``` ### Custom Worker Script **Basic worker pattern:** ```php boot(); $handler = static function () use ($myApp) { try { echo $myApp->handle($_GET, $_POST, $_COOKIE, $_FILES, $_SERVER); } catch (\Throwable $exception) { (new \MyCustomExceptionHandler)->handleException($exception); } }; $maxRequests = (int)($_SERVER['MAX_REQUESTS'] ?? 0); for ($nbRequests = 0; !$maxRequests || $nbRequests < $maxRequests; ++$nbRequests) { $keepRunning = \frankenphp_handle_request($handler); $myApp->terminate(); gc_collect_cycles(); if (!$keepRunning) break; } $myApp->shutdown(); ``` ### Laravel Integration **Laravel Octane installation:** ```bash composer require laravel/octane php artisan octane:install --server=frankenphp php artisan octane:frankenphp ``` **Laravel with Docker:** ```bash docker run -p 80:80 -p 443:443 -p 443:443/udp \ -v $PWD:/app \ dunglas/frankenphp ``` **Laravel Caddyfile:** ``` { frankenphp } localhost { root public/ encode zstd br gzip php_server { try_files {path} index.php } } ``` **Octane with file watching:** ```bash php artisan octane:frankenphp --watch ``` ### Symfony Integration **Symfony worker with runtime:** ```bash composer require runtime/frankenphp-symfony docker run \ -e FRANKENPHP_CONFIG="worker ./public/index.php" \ -e APP_RUNTIME=Runtime\\FrankenPhpSymfony\\Runtime \ -v $PWD:/app \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp ``` ### Worker Management **Watch files for changes (auto-reload):** ```bash frankenphp php-server --worker /path/to/worker.php \ --watch="/path/to/your/app/**/*.php" ``` **Restart workers via API:** ```bash curl -X POST http://localhost:2019/frankenphp/workers/restart ``` **Configure max consecutive failures (Caddyfile):** ``` frankenphp { worker { max_consecutive_failures 10 } } ``` ### Superglobals in Worker Mode **Accessing worker-bound vs request-bound values:** ```php