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:
- Laravel Herd (Native)
ramaid/image:php8.3-fullstack-http
via Docker (mm.test)ramaid/image:php8.3-franken
via Docker (mm-franken.test)- FrankenPHP dengan Docker dari repository jaygaha/laravel-11-frankenphp-docker (franken.test)
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
-
ramaid/image:php8.3-fullstack-http
- Base image dengan ServerSideUp FPM-Nginx-Alpine PHP 8.3
- Menggunakan server FullStack-HTTP
- Exposed port: 8080
-
ramaid/image:php8.3-franken
- Base image dengan
dunglas/frankenphp:1.3.6-php8.3-alpine
- Menggunakan FrankenPHP server
- Exposed port: 80
- Base image dengan
-
ramaid/image:php8.3-franken
- Base image dengan
dunglas/frankenphp:1.3.6-php8.3-alpine
- Menggunakan Laravel Octane server: https://github.com/dunglas/frankenphp/issues/797
- Exposed port: 8000
- Base image dengan
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%
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%
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%
π Analisis dan Kesimpulan
Performa Request per Second
ramaid/image:php8.3-franken
dengan Laravel Octane: 1659.9 req/s - Jelas sang juara! πramaid/image:php8.3-fullstack-http
: Runner-up dengan 528.84 req/sramaid/image:php8.3-franken
: 471.79 req/s- Laravel Herd: 194.39 req/s
- FrankenPHP Docker: 118.91 req/s
Response Time (Request Duration)
ramaid/image:php8.3-franken
dengan Laravel Octane: 1.49 ms - Gila cepatnya! π¨ramaid/image:php8.3-fullstack-http
: Lumayan cepat dengan 4.70 msramaid/image:php8.3-franken
: Cukup kompetitif dengan 5.28 ms- FrankenPHP Docker: 12.74 ms
- Laravel Herd: 14.58 ms
Observasi Penting
ramaid/image:php8.3-franken
dengan Laravel Octane benar-benar menunjukkan performa yang luar biasa.- Semua setup mencapai success rate 100%, menunjukkan stabilitas yang baik.
- 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
- Laravel Herd Documentation
- FrankenPHP GitHub
- jaygaha/laravel-11-frankenphp-docker
- PestPHP Documentation
- GitHub Issue #797: can't run worker mode on laravel
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