Benchmark Laravel Local Development: Laravel Herd vs Docker FullStack-HTTP vs FrankenPHP πŸš€

Hey developers! Hari ini saya akan membagikan pengalaman menarik dalam melakukan benchmark beberapa setup development Laravel yang sedang hits di 2025. Sebagai developer yang selalu penasaran dengan performa dan efisiensi, saya merasa penting untuk membagikan insight ini ke komunitas.

πŸ” Apa yang Akan Kita Bandingkan?

Dalam artikel ini, kita akan membandingkan 4 setup development yang berbeda:

  1. Laravel Herd (Native)
  2. ramaid/image:php8.3-fullstack-http via Docker (mm.test)
  3. ramaid/image:php8.3-franken via Docker (mm-franken.test)
  4. FrankenPHP dengan Docker dari repository jaygaha/laravel-11-frankenphp-docker (franken.test)
  5. ramaid/image:php8.3-franken dengan Laravel Octane via Docker (franken-worker.test)

πŸ›  Setup Environment

Laravel Herd Configuration

# Domain default: modern-monolith.test

Docker Setup

Kita menggunakan dua custom image Docker yang saya buat khusus untuk keperluan development Laravel:

# docker-compose.yml
services:
  http:
    image: ramaid/image:php8.3-fullstack-http
    volumes:
      - .:/var/www/html
    ports:
      - 9000:8080 # Accessible via mm.test

  franken:
    image: ramaid/image:php8.3-franken
    volumes:
      - .:/var/www/html
    ports:
      - 9001:80 # Accessible via mm-franken.test

  franken-worker:
    image: ramaid/image:php8.3-franken
    entrypoint: php artisan octane:frankenphp --workers=8 --port=8000
    volumes:
      - .:/var/www/html
    ports:
      - 9002:8000 # Accessible via franken-worker.test

Custom Docker Images

  1. ramaid/image:php8.3-fullstack-http

  2. ramaid/image:php8.3-franken

    • Base image dengan dunglas/frankenphp:1.3.6-php8.3-alpine
    • Menggunakan FrankenPHP server
    • Exposed port: 80
  3. ramaid/image:php8.3-franken

Proxy Setup via Laravel Herd

herd proxy --secure mm.test http://127.0.0.1:9000
herd proxy --secure mm-franken.test http://127.0.0.1:9001
herd proxy --secure franken.test http://127.0.0.1:61
herd proxy --secure franken-worker.test http://127.0.0.1:9002

Untuk mengakses aplikasi melalui domain yang friendly, kita menggunakan Laravel Herd sebagai reverse proxy:

# mm.test -> FullStack-HTTP
server {
    listen 127.0.0.1:443 ssl;
    server_name mm.test;
    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# mm-franken.test -> ramaid/image:php8.3-franken
server {
    listen 127.0.0.1:443 ssl;
    server_name mm-franken.test;
    location / {
        proxy_pass http://127.0.0.1:9001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# franken.test -> jaygaha/laravel-11-frankenphp-docker
server {
    listen 127.0.0.1:443 ssl;
    server_name franken.test;
    location / {
        proxy_pass http://127.0.0.1:61;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# franken-worker.test -> ramaid/image:php8.3-franken
server {
    listen 127.0.0.1:443 ssl;
    server_name franken.test;
    location / {
        proxy_pass http://127.0.0.1:9002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Dengan setup ini, kita bisa mengakses aplikasi melalui:

  • modern-monolith.test (Laravel Herd native)
  • mm.test (FullStack-HTTP variant (ramaid/image:php8.3-fullstack-http) via Docker)
  • mm-franken.test (Franken variant (ramaid/image:php8.3-franken) via Docker)
  • franken.test (FrankenPHP dari repository jaygaha)
  • franken-worker.test (Franken variant (ramaid/image:php8.3-franken) via Docker with Laravel Octane server)

πŸ”¬ Testing Methodology

Untuk memastikan hasil yang fair dan konsisten, kita menggunakan PestPHP Stress Testing dengan konfigurasi yang sama untuk semua setup:

./vendor/bin/pest stress {domain}.test --concurrency=3 --duration=3

Parameter yang digunakan:

  • Concurrency: 3 (simulasi 3 user concurrent)
  • Duration: 3 detik
  • Endpoint: Route default Laravel 11 (/up), healthcheck endpoint

πŸ“Š Hasil Benchmark

1. Laravel Herd (modern-monolith.test)

Requests Count: 194.39 reqs/s (585 requests)
Request Duration: 14.58 ms
TTFB: 14.47 ms
Success Rate: 100%

2. ramaid/image:php8.3-fullstack-http (mm.test)

Requests Count: 528.84 reqs/s (1,589 requests)
Request Duration: 4.70 ms
TTFB: 4.60 ms
Success Rate: 100%

3. ramaid/image:php8.3-franken (mm-franken.test)

Requests Count: 471.79 reqs/s (1,418 requests)
Request Duration: 5.28 ms
TTFB: 5.22 ms
Success Rate: 100%

Benchmark Laravel Local Development

4. FrankenPHP Docker (franken.test)

Requests Count: 118.91 reqs/s (367 requests)
Request Duration: 12.74 ms
TTFB: 12.60 ms
Success Rate: 100%

Benchmark Laravel jaygaha/laravel-11-frankenphp-docker

5. ramaid/image:php8.3-franken (franken-worker.test) with Laravel Octane

Requests Count: 1659.9 reqs/s (4983 requests)
Request Duration: 1.49 ms
TTFB: 1.45 ms
Success Rate: 100%

Benchmark Laravel Octane

πŸ† Analisis dan Kesimpulan

Performa Request per Second

  1. ramaid/image:php8.3-franken dengan Laravel Octane: 1659.9 req/s - Jelas sang juara! πŸš€
  2. ramaid/image:php8.3-fullstack-http: Runner-up dengan 528.84 req/s
  3. ramaid/image:php8.3-franken: 471.79 req/s
  4. Laravel Herd: 194.39 req/s
  5. FrankenPHP Docker: 118.91 req/s

Response Time (Request Duration)

  1. ramaid/image:php8.3-franken dengan Laravel Octane: 1.49 ms - Gila cepatnya! πŸ’¨
  2. ramaid/image:php8.3-fullstack-http: Lumayan cepat dengan 4.70 ms
  3. ramaid/image:php8.3-franken: Cukup kompetitif dengan 5.28 ms
  4. FrankenPHP Docker: 12.74 ms
  5. Laravel Herd: 14.58 ms

Observasi Penting

  1. ramaid/image:php8.3-franken dengan Laravel Octane benar-benar menunjukkan performa yang luar biasa.
  2. Semua setup mencapai success rate 100%, menunjukkan stabilitas yang baik.
  3. Perbedaan performa antara FrankenPHP worker mode dan setup lainnya sangat signifikan.

Rekomendasi

Untuk Local Development:

  • Jika performa adalah prioritas utama: ramaid/image:php8.3-franken dengan Laravel Octane adalah pilihan terbaik.
  • Jika kemudahan setup menjadi prioritas: Laravel Herd masih sangat layak untuk dipertimbangkan.

Untuk Production-like Environment:

  • ramaid/image:php8.3-franken dengan Laravel Octane sangat menjanjikan untuk performa tinggi.
  • Perlu evaluasi lebih lanjut untuk kasus penggunaan dengan beban yang lebih berat

πŸ”— Referensi


Artikel ini ditulis berdasarkan pengalaman langsung melakukan benchmark pada MacBook Pro M1 dengan 8GB RAM. Hasil mungkin berbeda tergantung spesifikasi hardware yang digunakan.

Follow saya di Twitter @ramageek untuk update seputar web development dan Laravel!

Published on January 5, 2025

Updated on January 11, 2025