Mendongkrat Performa Laravel dengan FrankenPHP: Sebuah Studi Kasus

I Nyoman Donostia 654 kata
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:

  1. Static variables: Gunakan php artisan octane:reload untuk reset
  2. Service container: Hindari app()->singleton yang menyimpan state mutable
  3. 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.

Resource Tambahan

I Nyoman Donostia

I Nyoman Donostia

Fullstack Developer - Bali, Indonesia

Artikel Terkait