# Laravel Octane di 2026: Swoole, RoadRunner dan Optimisasi Performa > Kuasai Laravel Octane 2.19 dengan FrankenPHP, Swoole dan RoadRunner. Pelajari pemilihan server, pencegahan memory leak, concurrent tasks, dan pola deployment production untuk aplikasi PHP berperforma tinggi. - Published: 2026-09-11 - Updated: 2026-09-11 - Author: Anthony Fillion-Maillet - Tags: laravel, octane, swoole, roadrunner, frankenphp, performance, php - Reading time: 12 min --- Laravel Octane mengubah performa aplikasi PHP dengan menjaga framework tetap ter-bootstrap di memori antar request. Versi 2.19 (Agustus 2026) mendukung tiga server siap produksi: [FrankenPHP](https://frankenphp.dev/), [Swoole](https://github.com/swoole/swoole-src), dan [RoadRunner](https://roadrunner.dev/). Masing-masing melayani kebutuhan operasional yang berbeda, dan memilih yang salah akan mengorbankan performa atau stabilitas. > **Referensi Cepat Pemilihan Server** > > FrankenPHP: setup paling sederhana, HTTP/3 native, single binary. RoadRunner: binary Go yang teruji, tidak memerlukan ekstensi PHP. Swoole: throughput maksimal dengan konkurensi coroutine, memerlukan manajemen ekstensi PECL. ## Bagaimana Octane Menghilangkan Overhead Bootstrap PHP-FPM tradisional menjalankan proses baru untuk setiap request. Laravel mem-boot service container, memuat konfigurasi, mendaftarkan provider, dan meresolve middleware pada setiap panggilan HTTP. Octane membalik model ini: aplikasi boot sekali per worker, kemudian instance yang sama menangani ribuan request secara berurutan. Keuntungan performa berasal dari menghilangkan pekerjaan berulang. Aplikasi Laravel 12 tipikal menghabiskan 15 hingga 40ms untuk bootstrap sebelum mengeksekusi logika bisnis. Dengan Octane, biaya tersebut turun menjadi nol setelah request pertama. Benchmark pada hardware identik menunjukkan peningkatan throughput 2x hingga 4x untuk endpoint API, dengan gap yang melebar seiring peningkatan kompleksitas aplikasi. ```php // config/octane.php return [ 'server' => env('OCTANE_SERVER', 'frankenphp'), // Workers handle HTTP requests 'workers' => env('OCTANE_WORKERS', 8), // Gracefully restart workers after N requests to prevent memory bloat 'max_requests' => env('OCTANE_MAX_REQUESTS', 500), // Task workers for Swoole concurrent operations 'task_workers' => env('OCTANE_TASK_WORKERS', 6), // Maximum execution time per request in seconds 'max_execution_time' => 30, ]; ``` Pengaturan `max_requests` berfungsi sebagai katup pengaman. Bahkan kode yang ditulis dengan baik dapat mengakumulasi memori selama ratusan request. Mengatur nilai ini ke 500 memaksa worker untuk restart sebelum tekanan memori menjadi masalah. ## FrankenPHP: Default 2026 untuk Proyek Baru [FrankenPHP](https://frankenphp.dev/) didistribusikan sebagai single binary yang dibangun di atas Caddy dan PHP. Server ini menangani sertifikat HTTPS secara otomatis melalui Let's Encrypt, mendukung HTTP/3 langsung, dan tidak memerlukan ekstensi PHP untuk diinstal. Installer Laravel dan contoh produksi sekarang default ke FrankenPHP. ```bash # Install Octane with FrankenPHP composer require laravel/octane php artisan octane:install --server=frankenphp # Start the server php artisan octane:start --server=frankenphp --host=0.0.0.0 --port=8000 ``` Untuk deployment terkontainerisasi, FrankenPHP menyediakan image Docker resmi: ```dockerfile # Dockerfile FROM dunglas/frankenphp RUN install-php-extensions \ pcntl \ pdo_pgsql \ redis COPY . /app ENTRYPOINT ["php", "artisan", "octane:frankenphp"] ``` Konfigurasi Docker Compose untuk development mengaktifkan HTTPS dan HTTP/3: ```yaml # compose.yaml services: frankenphp: build: context: . entrypoint: php artisan octane:frankenphp --workers=1 --max-requests=1 ports: - "443:443" - "443:443/udp" volumes: - .:/app ``` FrankenPHP menangani restart worker dengan anggun dan terintegrasi langsung dengan sistem middleware Caddy untuk skenario routing tingkat lanjut. ## RoadRunner: Stabilitas Berbasis Go Tanpa Ketergantungan Ekstensi [RoadRunner](https://roadrunner.dev/) dikompilasi menjadi binary Go yang mengelola proses worker PHP. Server ini berkomunikasi dengan PHP melalui protokol biner, menjaga manajemen worker dan penanganan HTTP di Go sambil mengeksekusi kode aplikasi di PHP. Arsitektur ini menyediakan isolasi proses: worker PHP yang crash tidak mempengaruhi parent Go atau worker sibling. ```bash # Install Octane with RoadRunner composer require laravel/octane spiral/roadrunner-cli spiral/roadrunner-http php artisan octane:install --server=roadrunner # Download the RoadRunner binary ./vendor/bin/rr get-binary # Start the server php artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000 ``` Konfigurasi RoadRunner berada di `.rr.yaml` pada root proyek: ```yaml # .rr.yaml version: "3" server: command: "php artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8000" relay: pipes http: address: 0.0.0.0:8000 middleware: ["headers", "gzip"] pool: num_workers: 8 max_jobs: 500 supervisor: max_worker_memory: 128 ``` Pengaturan `max_worker_memory` (dalam MB) menghentikan worker yang melebihi batas memori, memberikan jaring pengaman tambahan di luar `max_requests`. Untuk tim dengan pipeline CI yang sudah mapan dan infrastruktur PHP-FPM yang ada, RoadRunner menawarkan jalur migrasi yang paling mulus. ## Swoole: Throughput Maksimum dengan Konkurensi Coroutine [Swoole](https://github.com/swoole/swoole-src) beroperasi sebagai ekstensi PHP yang menggantikan lifecycle request standar dengan runtime event-driven yang mendukung coroutine. Swoole menyediakan fitur yang tidak tersedia di server lain: eksekusi task konkuren, ticks dan intervals, serta cache in-memory dengan throughput 2 juta operasi per detik. ```bash # Install Swoole via PECL pecl install swoole # Add to php.ini echo "extension=swoole.so" >> $(php --ini | grep "Loaded Configuration" | cut -d: -f2 | xargs)/php.ini # Install Octane with Swoole composer require laravel/octane php artisan octane:install --server=swoole # Start with task workers for concurrent operations php artisan octane:start --server=swoole --workers=8 --task-workers=6 ``` Eksekusi task konkuren Swoole menangani operasi I/O paralel dalam satu request: ```php // app/Http/Controllers/DashboardController.php use App\Models\User; use App\Models\Order; use App\Models\Analytics; use Laravel\Octane\Facades\Octane; class DashboardController extends Controller { public function index() { // Execute three queries concurrently instead of sequentially [$users, $orders, $analytics] = Octane::concurrently([ fn () => User::active()->count(), fn () => Order::today()->sum('total'), fn () => Analytics::hourly()->get(), ]); return view('dashboard', compact('users', 'orders', 'analytics')); } } ``` Tanpa `Octane::concurrently()`, ketiga query ini dieksekusi secara berurutan: 50ms + 30ms + 40ms = 120ms total. Dengan eksekusi konkuren, total waktu sama dengan query paling lambat: 50ms. Flag `--task-workers` mengontrol berapa banyak operasi konkuren yang dapat berjalan secara bersamaan di semua request worker. > **Fitur Khusus Swoole** > > Concurrent tasks, ticks, intervals, Octane cache, dan Swoole tables memerlukan ekstensi Swoole. FrankenPHP dan RoadRunner tidak mendukung fitur-fitur ini. Evaluasi apakah aplikasi memerlukan fitur-fitur tersebut sebelum berkomitmen pada kompleksitas operasional Swoole. ## Pencegahan Memory Leak: Menulis Kode Stateless Performa Octane berasal dari state persisten, yang menciptakan tantangan utama: kode yang bekerja dengan baik di PHP-FPM dapat menyebabkan memory leak parah di Octane. Instance aplikasi bertahan antar request, sehingga properti statis, singleton, dan state global terakumulasi. Tiga pola menyebabkan sebagian besar memory leak: **Array statis yang tumbuh tanpa batas:** ```php // WRONG: Memory leak - array grows with every request class MetricsCollector { public static array $data = []; public static function record(string $metric): void { self::$data[] = $metric; // Never cleared between requests } } // CORRECT: Use request-scoped storage or external systems class MetricsCollector { public function record(string $metric): void { Redis::lpush('metrics', $metric); // External storage } } ``` **Singleton yang menyimpan data spesifik request:** ```php // WRONG: First request's user leaks into subsequent requests $this->app->singleton(UserContext::class, function ($app) { return new UserContext($app['request']->user()); }); // CORRECT: Use closures for deferred resolution $this->app->singleton(UserContext::class, function ($app) { return new UserContext(fn () => $app['request']->user()); }); ``` **Injeksi container dan request di constructor:** ```php // WRONG: Captures stale container/request class PaymentService { public function __construct( private Application $app, private Request $request ) {} } // CORRECT: Inject via method parameters or use helpers class PaymentService { public function processPayment(Request $request): void { $user = $request->user(); $config = config('services.stripe.key'); // Global helper, always fresh } } ``` Helper global `app()`, `request()`, dan `config()` selalu mengembalikan nilai terkini. Menggunakannya alih-alih constructor injection menghindari sebagian besar leak terkait singleton. ## Pola Deployment Produksi Server Octane memerlukan supervisi proses untuk restart saat crash. Supervisor menangani ini dengan andal: ```ini ; /etc/supervisor/conf.d/octane.conf [program:octane] process_name=%(program_name)s_%(process_num)02d command=php /var/www/app/artisan octane:start --server=frankenphp --host=127.0.0.1 --port=8000 autostart=true autorestart=true user=www-data redirect_stderr=true stdout_logfile=/var/www/app/storage/logs/octane.log stopwaitsecs=3600 ``` Untuk deployment, worker Octane harus reload untuk mengambil kode baru. Perintah `octane:reload` menangani ini dengan anggun, menunggu request yang sedang berjalan selesai sebelum mendaur ulang worker: ```bash # In deployment script (after git pull, composer install, etc.) php artisan octane:reload ``` Nginx berada di depan Octane untuk melayani aset statis dan menghentikan SSL: ```nginx # /etc/nginx/sites-available/app.conf upstream octane { server 127.0.0.1:8000; keepalive 32; } server { listen 443 ssl http2; server_name example.com; root /var/www/app/public; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { try_files $uri $uri/ @octane; } location @octane { proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Connection ""; proxy_pass http://octane; } } ``` Directive `keepalive` mempertahankan koneksi persisten antara Nginx dan Octane, mengurangi overhead TCP handshake untuk request yang di-proxy. ## Pohon Keputusan Pemilihan Server Memilih antara FrankenPHP, RoadRunner, dan Swoole bergantung pada batasan operasional dan kebutuhan aplikasi: | Kebutuhan | Server yang Direkomendasikan | |-----------|-----------------------------| | Setup paling sederhana, deployment terkontainerisasi | FrankenPHP | | Dukungan HTTP/3 langsung | FrankenPHP | | Tidak ada ketergantungan ekstensi PHP | FrankenPHP atau RoadRunner | | Isolasi proses maksimum | RoadRunner | | Infrastruktur PHP-FPM yang sudah ada | RoadRunner | | I/O konkuren dalam request | Swoole | | Caching in-memory (2M ops/detik) | Swoole | | Ticks, intervals, background tasks | Swoole | | Swoole tables untuk shared state | Swoole | Untuk tim yang memulai proyek baru di 2026, FrankenPHP memberikan keseimbangan terbaik antara kesederhanaan dan kapabilitas. Migrasi aplikasi yang sudah ada bekerja paling baik dengan RoadRunner karena isolasi proses dan model deployment yang familiar. Swoole cocok untuk API throughput tinggi yang memanfaatkan konkurensi coroutine dan memerlukan fitur khusus Swoole. ## Pertanyaan Interview tentang Laravel Octane Interview teknis semakin sering mencakup Octane karena aplikasi Laravel traffic tinggi mengadopsinya. Pertanyaan umum dan apa yang dicari interviewer: **"Bagaimana Octane mencapai peningkatan performanya?"** Jawaban yang diharapkan: Octane mem-boot Laravel sekali per worker dan menggunakan kembali instance tersebut antar request, menghilangkan biaya bootstrap 15-40ms pada setiap request. Kandidat harus menyebutkan bahwa method `register` dan `boot` service provider berjalan sekali per worker, bukan per request. **"Apa yang menyebabkan memory leak di aplikasi Octane?"** Jawaban kuat mengidentifikasi tiga sumber: array statis yang mengakumulasi data, singleton yang menangkap state spesifik request, dan constructor injection objek container atau request. Kandidat harus menjelaskan bahwa perbaikannya melibatkan penggunaan closure untuk resolusi tertunda atau melewatkan data melalui parameter method. **"Kapan memilih Swoole daripada RoadRunner?"** Keunggulan Swoole adalah konkurensi coroutine via `Octane::concurrently()`, Octane cache berkecepatan tinggi, dan fitur seperti ticks dan intervals. Trade-off-nya adalah kompleksitas operasional: Swoole memerlukan pengelolaan ekstensi PECL, sementara RoadRunner didistribusikan sebagai binary Go. Untuk aplikasi CRUD tanpa kebutuhan I/O konkuren, RoadRunner lebih sederhana untuk dioperasikan. **"Bagaimana menangani deployment dengan Octane?"** Urutan deployment: berhenti menerima koneksi baru, tunggu request yang sedang berjalan selesai, reload worker dengan kode baru. Perintah `php artisan octane:reload` menangani ini. Kandidat harus menyebutkan Supervisor atau systemd untuk supervisi proses dan Nginx atau Caddy sebagai reverse proxy. ## Monitoring dan Profiling Aplikasi Octane Monitoring memori menjadi kritis di Octane. Worker tetap ada, sehingga pertumbuhan memori mengindikasikan leak daripada overhead request normal. Laravel Pulse dan Telescope keduanya bekerja dengan Octane dan menyediakan profiling level request. ```php // app/Providers/AppServiceProvider.php use Laravel\Octane\Events\RequestReceived; use Laravel\Octane\Events\RequestTerminated; public function boot(): void { Event::listen(RequestReceived::class, function ($event) { $event->sandbox->instance('request.memory.start', memory_get_usage()); }); Event::listen(RequestTerminated::class, function ($event) { $start = $event->sandbox->make('request.memory.start'); $delta = memory_get_usage() - $start; if ($delta > 1024 * 1024) { // More than 1MB growth Log::warning('High memory delta', [ 'path' => $event->request->path(), 'delta_mb' => round($delta / 1024 / 1024, 2), ]); } }); } ``` Event listener ini mencatat request yang meningkatkan memori lebih dari 1MB, membantu mengidentifikasi endpoint yang perlu optimisasi. Untuk monitoring produksi, tool APM eksternal seperti Datadog atau New Relic menyediakan visibilitas level worker. ## Mengintegrasikan Octane dengan Queue dan Horizon Octane menangani request HTTP; [Laravel Horizon](https://laravel.com/docs/12.x/horizon) mengelola queue worker. Keduanya beroperasi secara independen dan saling melengkapi. Pemrosesan berat harus ditempatkan di queued jobs, menjaga worker Octane tetap responsif. ```php // app/Http/Controllers/ReportController.php use App\Jobs\GenerateReport; class ReportController extends Controller { public function generate(Request $request) { // Dispatch to queue instead of blocking the Octane worker GenerateReport::dispatch($request->user(), $request->input('parameters')); return response()->json(['status' => 'processing']); } } ``` ## Yang Perlu Diingat tentang Laravel Octane di 2026 - Octane 2.19 mendukung tiga server: FrankenPHP (paling sederhana), RoadRunner (paling stabil), dan Swoole (fitur terlengkap) - Peningkatan performa berasal dari penghilangan bootstrap per-request; harapkan peningkatan throughput 2x hingga 4x - Memory leak terjadi karena state worker tetap ada; hindari array statis, request yang di-inject di constructor, dan singleton dengan data request - Gunakan `--max-requests=500` untuk memaksa daur ulang worker sebelum tekanan memori meningkat - Fitur khusus Swoole meliputi `Octane::concurrently()`, ticks, intervals, dan Octane cache - Deploy di belakang Nginx atau Caddy dengan Supervisor untuk manajemen proses - Profil pertumbuhan memori per request; delta lebih dari 1MB mengindikasikan potensi leak - Antrikan pekerjaan berat melalui Horizon; biarkan worker Octane menangani respons HTTP cepat --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/id/blog/laravel/laravel-octane-swoole-roadrunner-performance-optimization