Laravel Octane Benchmark: FrankenPHP vs Swoole vs RoadRunner vs PHP-FPM - NextGenBeing
Back to discoveries

Laravel Octane Benchmark: FrankenPHP vs Swoole vs RoadRunner vs PHP-FPM

Laravel Octane benchmark of FrankenPHP, Swoole, RoadRunner and PHP-FPM in Docker: three-run laptop numbers, full setup, what breaks under Octane, and when to switch.

Cloud Computing Premium Content 12 min read
Bekzod Erkinov

Bekzod Erkinov

Oct 13, 2026 • 138 views
Laravel Octane Benchmark: FrankenPHP vs Swoole vs RoadRunner vs PHP-FPM
Photo by Hazel Z on Unsplash
Size:
Height:
12 min read 4,649 words Focus mode: Eye care:

Listen to Article

Loading...
0:00 / 0:00
0:00 0:00
Low High
0% 100%
⏸ Paused ▶️ Now playing... Ready to play ✓ Finished

Laravel Octane Benchmark: FrankenPHP vs Swoole vs RoadRunner vs PHP-FPM

Most Octane benchmarks are a hello-world on hardware nobody describes. I ran the same Laravel app under PHP-FPM, FrankenPHP, Swoole and RoadRunner in Docker on one laptop, three runs per cell, then broke it on purpose in the ways Octane breaks apps. You get the numbers (laptop numbers, with their spread), every Dockerfile needed to rerun them, the failures with real output, and the fixes.

Laravel Octane benchmark setup

  • App: fresh laravel/laravel with laravel/octane v2.21.0, which the Octane releases page showed as the latest release (06 Oct) when I checked on 11 Oct 2026. Default web middleware, array session and cache drivers, SQLite.
  • Versions as reported inside my containers (I did not cross-check them upstream): Laravel framework v13.35.0, PHP 8.4.26, FrankenPHP v1.13.1 (Caddy v2.11.7), Swoole 6.2.3, RoadRunner 2025.1.15, oha 1.16.0, Docker 29.7.2.
  • Limits: every container ran with --cpus=4 --memory=2g and 4 workers (FPM: pm = static, pm.max_children = 4).
  • Load: oha, 64 concurrent connections, 20 seconds after a 5-second warm-up, from a container on the same Docker network.
  • Machine: a Windows 11 laptop, Docker Desktop reporting 8 CPUs and ~8 GB. The load generator shares the machine with the server, so treat absolute numbers as low and noisy.

Laravel Octane benchmark results: FrankenPHP vs Swoole vs RoadRunner vs PHP-FPM

Three runs per cell. Each cell is the median (min–max) of those three runs. All 24 runs had a 100% success rate.

/json (returns a small JSON body):

Server rps p50 ms p99 ms
PHP-FPM 320 (273–383) 177 (156–226) 434 (351–459)
Swoole 508 (400–538) 103 (99–136) 658 (656–784)
RoadRunner 362 (252–400) 150 (133–238) 493 (372–658)
FrankenPHP 534 (472–566) 112 (108–136) 232 (197–239)

/db (a count() plus the latest 20 rows of a 1,000-row SQLite table):

Server rps p50 ms p99 ms
PHP-FPM 237 (155–242) 268 (246–416) 614 (532–666)
Swoole 366 (296–373) 149 (148–163

Unlock Premium Content

You've read 30% of this article

What's in the full article

  • Complete step-by-step implementation guide
  • Working code examples you can copy-paste
  • Advanced techniques and pro tips
  • Common mistakes to avoid
  • Real-world examples and metrics

Join 10,000+ developers who love our premium content

Bekzod Erkinov

Bekzod Erkinov

Author

Founder of NextGenBeing. Software engineer working with Laravel, Python, and cloud infrastructure. Writes about patterns that actually hold up in production. Based in Tashkent, Uzbekistan.

Free guide

Get the AI-Assisted Developer's Field Guide

The workflow, prompts, and tools I use to ship faster with AI — free when you subscribe. Plus new deep-dives in your inbox. No spam, unsubscribe anytime.

Comments (0)

Please log in to leave a comment.

Log In

Related Articles

Don't miss the next deep dive

Get one well-researched tutorial in your inbox each week. No spam, unsubscribe anytime.