Mempercepat Laravel dengan FrankenPHP dan Octane


Laravel merupakan framework PHP yang sangat populer karena kemudahan penggunaan dan fleksibilitasnya. Namun, ketika digunakan di lingkungan produksi, performa Laravel bisa terbatas karena PHP biasanya memproses setiap request secara terpisah. Untuk mengatasi hal ini, Laravel menawarkan Octane, sebuah server yang menjaga aplikasi tetap hidup di memori, sehingga request berikutnya bisa diproses lebih cepat. Salah satu server yang mendukung Octane dengan performa tinggi adalah FrankenPHP.

Dalam artikel ini, kita akan membahas bagaimana mengatur Laravel dengan Octane menggunakan FrankenPHP, lengkap dengan Docker, sehingga bisa langsung diuji performanya.


1. Struktur Proyek

Sebelum mulai, berikut contoh struktur direktori Laravel dengan setup Octane dan FrankenPHP:

laravel-franken/
├─ Dockerfile
├─ docker-compose.yml
├─ Caddyfile (opsional)
├─ .env
├─ composer.json
├─ public/
│   └─ index.php
├─ bootstrap/
│   └─ app.php
└─ ... (file Laravel lainnya)
  • Semua konfigurasi Octane bisa diletakkan di .env.
  • Caddyfile opsional jika ingin menggunakan server HTTP tambahan.

2. Konfigurasi .env Laravel

Octane membaca pengaturan server dari environment, sehingga kita bisa menyimpannya di .env:

APP_ENV=production
APP_DEBUG=false

OCTANE_SERVER=frankenphp
OCTANE_HOST=0.0.0.0
OCTANE_PORT=80
OCTANE_ADMIN_PORT=2019
OCTANE_HTTPS=false

Ini memudahkan konfigurasi berbeda untuk development dan production tanpa harus mengubah Dockerfile.


3. Dockerfile

Untuk memanfaatkan Octane dan FrankenPHP, Dockerfile bisa dibuat dua stage: satu untuk composer, satu untuk FrankenPHP.

# Stage 1: Composer dependencies
FROM composer:latest AS vendor
WORKDIR /app
COPY . .
RUN composer install --no-dev --optimize-autoloader --no-interaction --no-scripts \
 && composer require laravel/octane --no-interaction

# Stage 2: FrankenPHP + Laravel
FROM dunglas/frankenphp:latest
WORKDIR /app

# Copy project + vendor
COPY --from=vendor /app /app

# Install PHP extensions
RUN apt update && apt install -y zip libzip-dev \
 && docker-php-ext-install zip pcntl \
 && docker-php-ext-enable zip pcntl

# Expose port
EXPOSE 80

# Start Octane server
CMD ["php", "artisan", "octane:start", "--server=frankenphp", "--host=0.0.0.0", "--port=80", "--admin-port=2019"]

Kelebihan setup ini:

  • Laravel dimuat sekali di memori → request berikutnya lebih cepat.
  • Octane menggunakan FrankenPHP worker → performa tinggi.
  • Semua konfigurasi bisa diambil dari .env.

4. Docker Compose

version: "3.9"
services:
  app:
    build: .
    env_file:
      - .env
    ports:
      - "8080:80"
    volumes:
      - .:/app
  • Dengan env_file, Docker secara otomatis membaca semua environment Laravel.
  • Port 8080 di host akan diarahkan ke port 80 container.

5. Menjalankan Container

Untuk menjalankan Laravel + Octane + FrankenPHP:

docker compose down -v
docker compose up --build -d
docker compose logs -f
  • Log akan menampilkan pesan Octane server is running dan FrankenPHP started.
  • Laravel kini persistent di memori dan siap menerima request cepat.

6. Mengecek Octane Aktif

Masuk ke container:

docker compose exec app bash

Lalu jalankan:

php artisan octane:status

Hasil yang diharapkan:

Server: FrankenPHP
Host: 0.0.0.0
Port: 80
Admin Port: 2019
Workers: 8
State: running

Jika State: running muncul, Octane sudah aktif.


7. Test Endpoint

Buat route sederhana di routes/web.php:

Route::get('/ping', fn() => response('pong'));

Kemudian test dari host:

curl http://localhost:8080/ping

Jika muncul pong, Laravel + Octane sudah menangani request.


8. Load Testing

Untuk mengukur performa, gunakan ApacheBench:

ab -n 5000 -c 100 http://localhost:8080/ping
  • Requests per second menunjukkan seberapa cepat server memproses request.
  • Dengan Octane + FrankenPHP, RPS biasanya meningkat signifikan dibanding PHP-FPM biasa.

9. Tips Meningkatkan Performa

  1. Tambahkan jumlah worker Octane: php artisan octane:start --workers=8 --task-workers=4
  2. Aktifkan OPcache dan preload Laravel.
  3. Gunakan route cache dan config cache: php artisan route:cache php artisan config:cache
  4. Optimalkan container dengan CPU dan memory lebih tinggi jika di server production.

Kesimpulan

Menggunakan Laravel + Octane + FrankenPHP membuat aplikasi PHP lebih cepat karena:

  • Laravel hanya di-load sekali di memori.
  • FrankenPHP worker meng-handle banyak request sekaligus.
  • Load test menunjukkan request per second meningkat drastis dibanding PHP-FPM biasa.

Dengan setup Docker + .env seperti ini, kamu bisa dengan mudah men-deploy baik untuk development maupun production tanpa mengubah Dockerfile.

Leave a Reply

Your email address will not be published. Required fields are marked *