Selama lebih dari dua dekade, arsitektur standar eksekusi PHP pada web server berbasis PHP-FPM mengandalkan model shared-nothing execution: setiap kali ada permintaan HTTP masuk, PHP akan melakukan bootstrapping menyeluruh (membaca ratusan file vendor, mendaftarkan ribuan service providers, membaca konfigurasi .env, dan menginisiasi koneksi database), lalu menghapus seluruh memori setelah respons selesai dikirim.
Di era microservices dan sistem dengan throughput tinggi seperti pada proyek Enterprise Scholarship Platform, overhead bootstrapping di setiap request menjadi beban I/O yang tidak perlu.
graph TD
subgraph Model Tradisional: PHP-FPM
A1[HTTP Request] --> B1[Boot Framework & Load 500+ Files]
B1 --> C1[Execute Controller Logic]
C1 --> D1[Send HTTP Response]
D1 --> E1[Flush & Destroy Entire Memory]
end
subgraph Modern: Laravel Octane + FrankenPHP
A2[Worker Startup: Boot 1x] --> B2[Keep Framework in RAM]
C2[HTTP Request 1] --> D2[Instant Execution in Memory: ~15ms]
E2[HTTP Request 2] --> F2[Instant Execution in Memory: ~12ms]
end
1. Perbedaan Mendasar: Worker Mode In-Memory
Dengan mengintegrasikan Laravel Octane bersama FrankenPHP, aplikasi tidak lagi di-boot ulang pada setiap request:
- Boot Once, Serve Forever: Seluruh dependensi, konfigurasi, dan service container diinisialisasi satu kali saat server pertama kali dinyalakan.
- Sub-20ms Response Latency: Karena tidak ada lagi proses membaca ratusan file PHP dari disk storage di setiap request, waktu pemrosesan permintaan (TTFB) terpangkas drastis dari rata-rata 80-150ms menjadi 10-25ms.
- Caddy Web Server Bawaan: FrankenPHP dibangun di atas web server Caddy modern (berbasis Go) yang secara otomatis mendukung HTTP/2, HTTP/3, dan auto-renewing SSL certificates.
2. Tantangan & State Management pada Aplikasi Stateful
Menjalankan PHP dalam mode memory-persistent membutuhkan kehati-hatian ekstra terhadap state leakage atau kebocoran memori (memory leak):
- Hindari Storing Request Data di Singleton: Karena instance kelas singleton tetap hidup di memori lintas request, jangan pernah menyimpan data user autentikasi atau token ke dalam properti statis.
- Octane Listeners: Gunakan event listener Octane (
RequestReceived,RequestTerminated,Tick) untuk membersihkan data cache sementara setelah request selesai diproses.
// Contoh pembersihan state pada AppServiceProvider
use Laravel\Octane\Events\RequestTerminated;
Octane::handleTerminated(function (RequestTerminated $event) {
// Reset state atau temporary memory registry
});
3. Konfigurasi Produksi Docker Compose
Berikut konfigurasi container FrankenPHP teroptimasi untuk lingkungan produksi:
services:
app:
image: dunglas/frankenphp:latest-php8.4
restart: unless-stopped
ports:
- "8000:8000"
environment:
FRANKENPHP_CONFIG: "worker ./public/frankenphp-worker.php"
OCTANE_SERVER: "frankenphp"
OCTANE_WORKERS: "auto"
volumes:
- ./:/app