Mendongkrat Performa Laravel dengan FrankenPHP: Sebuah Studi Kasus
Pendahuluan
Sebagai Fullstack Developer yang rutin bekerja dengan Laravel di perusahaan teknologi di Bali, performa selalu menjadi prioritas. Selama bertahun-tahun, setup standar Nginx + PHP-FPM adalah pilihan utama untuk production. Namun, munculnya FrankenPHP sebagai application server modern mengubah lanskap performa PHP secara radikal.
Artikel ini adalah catatan studi kasus nyata ketika saya memigrasi aplikasi Laravel dari Nginx/PHP-FPM ke FrankenPHP dan hasil yang saya dapatkan.
Apa itu FrankenPHP?
FrankenPHP adalah application server untuk PHP yang dibangun di atas Caddy web server. Berbeda dengan PHP-FPM yang berjalan sebagai proses terpisah, FrankenPHP menjalankan PHP sebagai modul native di dalam server. Ini berarti PHP embedded langsung ke dalam web server, menghilangkan overhead komunikasi antar-proses (IPC).
Arsitektur FrankenPHP
Klien → Caddy → FrankenPHP (embedded PHP) → Aplikasi Laravel
(HTTPS, HTTP/3)
Keunggulan utama FrankenPHP:
- Worker Mode: Aplikasi PHP tetap berada di memori antar request, tidak perlu bootstrap ulang
- HTTP/3 support: Native via Caddy
- Static file serving optimal: Caddy menangani file statis langsung
- Konfigurasi sederhana: Satu binary, satu file konfigurasi
Benchmark: FrankenPHP vs Nginx/PHP-FPM
Saya melakukan benchmark menggunakan wrk terhadap endpoint API sederhana yang mengembalikan JSON response. Berikut hasilnya:
| Setup | Requests/sec | Latency (ms) | Memory Usage |
|---|---|---|---|
| Nginx + PHP-FPM | ~420 | 23.8 | 128MB |
| FrankenPHP (normal) | ~680 | 14.7 | 145MB |
| FrankenPHP (worker mode) | ~1.150 | 8.6 | 180MB |
| Laravel Octane + FrankenPHP | ~1.430 | 6.9 | 210MB |
Peningkatan performa dengan worker mode mencapai 2.7x lipat dibanding setup tradisional. Dengan Laravel Octane, angkanya melonjak ke 3.4x.
Konfigurasi Awal
1. Install FrankenPHP via Docker
# Dockerfile
FROM dunglas/frankenphp:latest
COPY . /app
RUN install-php-extensions \
pdo_mysql \
intl \
opcache
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
2. Caddyfile Configuration
{
frankenphp
}
:80 {
root * /app/public
encode zstd gzip
php_server
}
3. Enable Worker Mode dengan Laravel Octane
composer require laravel/octane
php artisan octane:install --server=frankenphp
Konfigurasi config/octane.php:
'servers' => [
'frankenphp' => [
'workers' => env('OCTANE_FRANKENPHP_WORKERS', 8),
'max_requests' => env('OCTANE_FRANKENPHP_MAX_REQUESTS', 500),
],
],
4. docker-compose.yml
services:
app:
build: .
ports:
- "80:80"
- "443:443"
environment:
- APP_ENV=production
- OCTANE_FRANKENPHP_WORKERS=8
- DATABASE_URL=mysql://user:pass@db:3306/app
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: app
MYSQL_USER: user
MYSQL_PASSWORD: pass
Studi Kasus Real
Dalam project perusahaan, kami mengelola platform dengan ~5000 pengguna aktif harian. Endpoint API kami menerima beban 80-150 request per detik saat puncak. Sebelum migrasi:
- CPU usage saat peak: 65-80%
- Response time P95: 350ms
- Cold start setelah deploy: 2-3 detik untuk request pertama
Setelah migrasi ke FrankenPHP + Octane:
- CPU usage saat peak: 30-45% ✅
- Response time P95: 110ms ✅
- Cold start setelah deploy: hampir tidak ada ✅
Kapan Harus Migrasi ke FrankenPHP?
Migrasi jika:
- Aplikasi Anda menerima request rate tinggi (>100 RPS konsisten)
- Ingin memanfaatkan HTTP/3 untuk mobile API
- Payload response kecil tapi frekuensi tinggi
- Ingin menyederhanakan deployment (satu container)
Tetap dengan PHP-FPM jika:
- Traffic rendah (< 20 RPS)
- Aplikasi dengan memory leak yang belum diperbaiki
- Tim belum familiar dengan worker mode (perlu manage state)
⚠️ Penting diingat: Worker mode berarti state aplikasi tetap di memori antar request. Anda harus hati-hati dengan:
- Static variables: Gunakan
php artisan octane:reloaduntuk reset - Service container: Hindari
app()->singletonyang menyimpan state mutable - Connection pool: Database & Redis connection di-reuse
Kesimpulan
FrankenPHP adalah revolusi nyata untuk ekosistem PHP. Dalam kasus saya, peningkatan 3x performa dan pengurangan separuh CPU usage di production adalah transformasi yang signifikan. Kombinasi Laravel Octane + FrankenPHP menjadikan Laravel layak sebagai backend API modern yang kompetitif.
Jika aplikasi Anda sudah mature dan ingin scaling, FrankenPHP adalah investasi yang pasti. Mulailah dengan environment staging, benchmark endpoint kritis Anda, dan bandingkan secara objektif.