Menjalankan Laravel di atas FrankenPHP: integrasi resmi Laravel Octane dengan server FrankenPHP, perintah octane:frankenphp, warm-up cache agar bootstrap sekali benar-benar panas, dan susunan Caddyfile produksi dengan routing, static files, dan kompresi.

Setelah di episode 5 kita memahami mekanisme worker — bootstrap sekali, loop frankenphp_handle_request() — saatnya melihat bagaimana framework paling populer di dunia PHP memanfaatkannya. Episode ini membahas integrasi resmi Laravel Octane dengan FrankenPHP: dari instalasi, warm-up cache, sampai Caddyfile produksi.
Mengapa penting? Laravel adalah framework yang cukup berat untuk di-bootstrap (ratusan service container, provider, middleware). Di mode classic, setiap request membayar semua itu. Dengan Octane di atas FrankenPHP, bootstrap dibayar sekali — dan kombinasi keduanya adalah alasan terbesar adopsi FrankenPHP di 2026. Volt — paket Laravel untuk livewire/real-time — juga menikmati ini lewat dukungan Mercure yang dibahas di episode 18.
Octane adalah paket resmi Laravel untuk aplikasi app server. Install via Composer, lalu install server FrankenPHP-nya:
composer require laravel/octane
php artisan octane:install --server=frankenphpPerintah octane:install --server=frankenphp membuat konfigurasi config/octane.php dan menyalin Caddyfile stub ke root proyek.
php artisan octane:frankenphpSecara default ini berjalan di 127.0.0.1:8000 dengan admin port 2019. Untuk development yang nyaman, aktifkan hot reload:
php artisan octane:frankenphp --watch --port=8000Octane bisa langsung mengaktifkan HTTPS, HTTP/2, dan HTTP/3 dengan sertifikat otomatis:
php artisan octane:frankenphp --https --http-redirect --port=443Buka https://localhost — FrankenPHP menerbitkan sertifikat internal untuk localhost secara otomatis.
Octane mem-bootstrap aplikasi sekali, tetapi framework tetap harus membaca banyak file konfigurasi di setiap request kecuali kalian meng-cache-nya. Tanpa warm-up, "bootstrap sekali" hanya menghemat sebagian kecil pekerjaan. Jalankan semua cache sebelum produksi:
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan optimizephp artisan optimize menjalankan beberapa cache sekaligus. Setelah cache panas, setiap request Octane hanya bekerja pada cache dalam memori — ini sumber kecepatan yang sebenarnya.
Tip
Ingat urutan deployment yang benar: cache dulu (config, route, view, event), baru restart worker. Jika kalian restart worker dulu lalu cache, worker pertama akan membaca file konfigurasi yang belum dikunci. Sebaliknya, setelah file berubah, jangan lupa rebuild cache lalu restart worker.
octane:frankenphp| Opsi | Default | Fungsi |
|---|---|---|
--workers | auto | Jumlah worker (bukan worker_num Caddyfile) |
--max-requests | 500 | Restart worker setelah N request (anti memory leak) |
--host / --port | 127.0.0.1:8000 | Alamat bind |
--admin-port | 2019 | Port admin API Caddy |
--caddyfile | stub Octane | Path Caddyfile yang dipakai |
--https | off | Aktifkan HTTPS + HTTP/2 + HTTP/3 otomatis |
--http-redirect | off | Redirect HTTP ke HTTPS (butuh --https) |
--log-level | — | Log JSON terstruktur (disarankan untuk produksi) |
Kombinasi produksi yang umum:
php artisan octane:frankenphp \
--host=0.0.0.0 \
--port=8000 \
--workers=auto \
--max-requests=500 \
--log-level=infoUntuk kontrol penuh (misal route khusus, kompresi, header), gunakan Caddyfile sendiri. Jalankan frankenphp run dari root proyek:
{
frankenphp {
worker {
file /app/public/index.php
num 8
}
}
}
localhost {
root * public/
encode zstd br gzip
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
}
php_server {
try_files {path} index.php
}
}Catatan penting:
worker { file public/index.php } — file worker Laravel adalah public/index.php; Octane sudah menyiapkannya.try_files {path} index.php — Laravel memakai front controller tunggal; ini menghindari pencarian file yang tidak perlu.root * public/ — webroot Laravel selalu public/.Image resmi dunglas/frankenphp bisa langsung menjalankan Laravel:
docker run \
-p 80:80 -p 443:443 -p 443:443/udp \
-v $PWD:/app \
-e FRANKENPHP_CONFIG="worker ./public/index.php" \
dunglas/frankenphpUntuk produksi, jangan lupa menjalankan migrasi dan warm-up cache di dalam image (bisa via frankenphp php-cli artisan migrate).
.env, route, dan view. Ukur perbedaannya dengan dan tanpa cache.max-requests terlalu besar → memory leak library pihak ketiga menumpuk. Nilai 500 adalah titik awal yang aman..env lalu tidak restart worker → worker tidak membaca ulang env; selalu restart setelah mengubah .env atau file kode.Pada episode 6 ini, kalian telah menjalankan Laravel di atas FrankenPHP.
Inti yang harus dibawa pulang:
composer require laravel/octane lalu octane:install --server=frankenphp.php artisan octane:frankenphp; --https untuk HTTPS lokal.config, route, view, event, optimize) adalah kunci bootstrap sekali yang benar-benar panas.--max-requests (default 500) menjaga worker dari memory leak.worker file public/index.php + try_files + encode.Di episode 7 selanjutnya kita membahas sisi Symfony: Symfony Runtime Integration — runtime/frankenphp-symfony, variabel APP_RUNTIME, HTTP cache, dan audit kompatibilitas worker dengan igor. Sampai jumpa di episode 7!