Il tuo Laravel impiega 200ms per rispondere a una richiesta semplice? Con 10 chiamate al secondo il server inizia a zoppicare? Il problema non è il framework: è il ciclo di vita di PHP. Ogni richiesta parte da zero — bootstrap, autoload, service container, middleware. Laravel Octane rompe questo schema e tiene l'applicazione in memoria. Noi di Meteora Web lo usiamo sui progetti ad alto traffico da quando è uscito. Vediamo come funziona Swoole e FrankenPHP, due motori che portano PHP in territorio da server persistenti.
Quale problema risolve Laravel Octane con Swoole e FrankenPHP?
PHP tradizionale è stateless per design. Ogni HTTP request parte da zero: carica il bootstrap, istanzia il container, registra i provider, esegue il middleware e solo dopo arriva al controller. Con Octane, l'applicazione viene caricata una volta in un processo worker che resta in memoria. Le richieste successive riutilizzano tutto. Il risparmio è enorme: da 100-200ms per request si scende a 5-15ms. La differenza? Il server virtuale al posto di un nuovo processo PHP per ogni richiesta.
Sponsored Protocol
Swoole è un'estensione C per PHP che implementa un event loop asincrono e un server HTTP embeddato. FrankenPHP è un server applicativo scritto in Go che esegue PHP attraverso un worker embedded, sviluppato dal team di Symfony. Entrambi funzionano con Laravel Octane senza modifiche al codice dell'applicazione. Scegli in base all'infrastruttura che già hai.
Come funziona Octane con Swoole rispetto a FrankenPHP?
Con Swoole: un vero server asincrono in PHP
Swoole trasforma PHP in un runtime asincrono: i worker process rimangono in vita, gestiscono le richieste in event loop e possono condividere stato (con attenzione). Octane integra Swoole come driver. Per installarlo:
# Installa l'estensione Swoole
pecl install swoole
# Aggiungi a php.ini
extension=swoole.so
# Installa Octane
composer require laravel/octane
php artisan octane:install --server=swoole
Avvia con php artisan octane:start --server=swoole --workers=4. Octane genera un file di configurazione config/octane.php dove puoi impostare il numero di worker, la porta, e le opzioni di Swoole (es. max_requests per il memory leak prevention).
Sponsored Protocol
Attenzione: Swoole richiede l'estensione installata a livello di server. Non tutti gli hosting condivisi la supportano. Su VPS o container è perfetto.
Con FrankenPHP: un server Go che parla PHP
FrankenPHP è un bundle: include un server HTTP in Go (Caddy sotto) che esegue PHP attraverso un worker process nativo. Non richiede estensioni PHP aggiuntive — solo il binario di FrankenPHP. Octane lo supporta come driver sperimentale stabile dalla versione 1.3.
# Installa FrankenPHP (esempio su Linux)
curl -sS https://frankenphp.dev/install.sh | sh
# Oppure usa Docker
docker run -v $PWD:/app dunglas/frankenphp
# Configura Octane
php artisan octane:install --server=frankenphp
php artisan octane:start --server=frankenphp --workers=4
FrankenPHP ha il vantaggio di non legarsi a estensioni PHP custom: è un singolo binario. Inoltre gestisce nativamente TLS (grazie a Caddy) e hot-reload dei worker. Per progetti già in container, è la scelta più pulita.
Sponsored Protocol
Quali guadagni di performance puoi ottenere con Laravel Octane?
Abbiamo misurato su un nostro progetto con Laravel 11, 20 endpoint API, DB MySQL locale. Con php-fpm (8 worker): ~180ms a request, 1200 req/s massimi. Con Octane+Swoole (4 worker): ~12ms a request, 5800 req/s stabili. Il throughput è quadruplicato e la latenza crollata. Su un e-commerce con picchi di traffico, Octane ha permesso di gestire il Black Friday con 8 worker invece di 20 container.
Non è magia: i worker consumano RAM continuativamente. Ogni worker può occupare 50-100MB. Su un server con 1GB, 4 worker sono il massimo. FrankenPHP è leggermente più leggero sulla RAM perché il worker Go è più snello rispetto al processo Swoole.
Come misurare l'impatto reale sul tuo progetto?
Prima di migrare, fai un benchmark di base. Usa ab (Apache Bench) o wrk:
Sponsored Protocol
# Benchmark con php-fpm
wrk -t4 -c50 -d10s http://tuo-dominio/api/test
# Benchmark con Octane
php artisan octane:start --server=swoole --workers=4
wrk -t4 -c50 -d10s http://localhost:8000/api/test
Confronta latenza media, percentile 99, e throughput. Octane dovrebbe mostrare una latenza 10-20x inferiore. Se la differenza è minima, verifica che il collo di bottiglia non sia il database o una API esterna — Octane non velocizza la logica, ma rimuove il sovraccarico del bootstrap.
Cosa fare adesso per adottare Laravel Octane?
- Verifica la compatibilità: Controlla che tutte le facades e helper usati nel codice siano thread-safe. Octane esegue le richieste in coroutine (Swoole) o worker concorrenti (FrankenPHP). Variabili globali, statiche, e singleton non gestiti possono causare race condition. Laravel è progettato per essere stateless, ma alcune librerie o codice legacy possono rompersi.
- Scegli il server: Se hai controllo sull'infrastruttura e vuoi performance massime, Swoole. Se usi Docker o vuoi un deploy semplice, FrankenPHP.
- Configura i worker: Per ogni core CPU, metti 1-2 worker. Monitora la memoria con
free -m. Aumenta ilmax_requests(es. 500) per prevenire memory leak: Octane ricicla il worker dopo N richieste. - Testa in staging: Non deploiare su produzione senza aver eseguito l'intero test suite. Octane espone bug di concorrenza dormienti.
- Considera RoadRunner: Anche RoadRunner (Go + PHP) è supportato da Octane. È simile a FrankenPHP ma con un ecosistema diverso. Se già usi RoadRunner, resta su quello.
Noi di Meteora Web abbiamo scelto Laravel Octane per i progetti che richiedono latenza bassa e scalabilità orizzontale. Se vuoi approfondire l'architettura completa di Laravel, dai un'occhiata alla nostra pagina sul Laravel Framework Completo. Per dubbi tecnici, la documentazione ufficiale di Octane resta il riferimento principale.