Belajar FrankenPHP - Laravel Integration (Octane & Volt)
Episode 6 of 25

Belajar FrankenPHP - Laravel Integration (Octane & Volt)

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.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Instalasi Octane

Octane adalah paket resmi Laravel untuk aplikasi app server. Install via Composer, lalu install server FrankenPHP-nya:

Install Laravel Octane
composer require laravel/octane
php artisan octane:install --server=frankenphp

Perintah octane:install --server=frankenphp membuat konfigurasi config/octane.php dan menyalin Caddyfile stub ke root proyek.

Menjalankan Server

Mode Development

Jalankan Octane di development
php artisan octane:frankenphp

Secara default ini berjalan di 127.0.0.1:8000 dengan admin port 2019. Untuk development yang nyaman, aktifkan hot reload:

Octane dengan watch
php artisan octane:frankenphp --watch --port=8000

Mode HTTPS Penuh (Localhost Saja)

Octane bisa langsung mengaktifkan HTTPS, HTTP/2, dan HTTP/3 dengan sertifikat otomatis:

Octane dengan HTTPS
php artisan octane:frankenphp --https --http-redirect --port=443

Buka https://localhost — FrankenPHP menerbitkan sertifikat internal untuk localhost secara otomatis.

Warm-Up Cache: Kunci Bootstrap Sekali

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:

Warm-up cache Laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan optimize

php 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.

Opsi Penting octane:frankenphp

OpsiDefaultFungsi
--workersautoJumlah worker (bukan worker_num Caddyfile)
--max-requests500Restart worker setelah N request (anti memory leak)
--host / --port127.0.0.1:8000Alamat bind
--admin-port2019Port admin API Caddy
--caddyfilestub OctanePath Caddyfile yang dipakai
--httpsoffAktifkan HTTPS + HTTP/2 + HTTP/3 otomatis
--http-redirectoffRedirect HTTP ke HTTPS (butuh --https)
--log-levelLog JSON terstruktur (disarankan untuk produksi)

Kombinasi produksi yang umum:

Octane produksi
php artisan octane:frankenphp \
  --host=0.0.0.0 \
  --port=8000 \
  --workers=auto \
  --max-requests=500 \
  --log-level=info

Konfigurasi Caddyfile Produksi

Untuk kontrol penuh (misal route khusus, kompresi, header), gunakan Caddyfile sendiri. Jalankan frankenphp run dari root proyek:

Caddyfile - Laravel produksi
{
    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/.

Menjalankan dengan Docker

Image resmi dunglas/frankenphp bisa langsung menjalankan Laravel:

Laravel + FrankenPHP Docker
docker run \
  -p 80:80 -p 443:443 -p 443:443/udp \
  -v $PWD:/app \
  -e FRANKENPHP_CONFIG="worker ./public/index.php" \
  dunglas/frankenphp

Untuk produksi, jangan lupa menjalankan migrasi dan warm-up cache di dalam image (bisa via frankenphp php-cli artisan migrate).

Common Pitfalls Laravel + Octane

  • Lupa warm-up cache → setiap request masih membaca file .env, route, dan view. Ukur perbedaannya dengan dan tanpa cache.
  • Menyimpan state per-request di service singleton → service yang menyimpan data request (misal current user) akan bocor ke request berikutnya. Gunakan properti per-request atau pattern yang sudah aman Octane.
  • max-requests terlalu besar → memory leak library pihak ketiga menumpuk. Nilai 500 adalah titik awal yang aman.
  • Mengedit .env lalu tidak restart worker → worker tidak membaca ulang env; selalu restart setelah mengubah .env atau file kode.

Penutup

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.
  • Jalankan dengan php artisan octane:frankenphp; --https untuk HTTPS lokal.
  • Warm-up cache (config, route, view, event, optimize) adalah kunci bootstrap sekali yang benar-benar panas.
  • --max-requests (default 500) menjaga worker dari memory leak.
  • Caddyfile produksi: worker file public/index.php + try_files + encode.

Di episode 7 selanjutnya kita membahas sisi Symfony: Symfony Runtime Integrationruntime/frankenphp-symfony, variabel APP_RUNTIME, HTTP cache, dan audit kompatibilitas worker dengan igor. Sampai jumpa di episode 7!

Belajar FrankenPHP - Laravel Integration (Octane & Volt) | Belajar FrankenPHP