 Autor: [Tomasz Nowosielski](/autorzy/tomasz-nowosielski) Redaktor naczelny, analityk hostingu · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Laravel Octane — RoadRunner i Swoole

# Laravel Octane — turbo PHP z RoadRunner i Swoole

Opublikowano: 10 kwietnia 2026 · Kategoria: Hosting

Laravel Octane to oficjalny pakiet pierwszej linii od Laravela, który rozwiązuje fundamentalne wąskie gardło PHP: każdy request uruchamia PHP od zera, ładuje Composera, bootstrapuje frameworka i tworzy service container. Octane ładuje aplikację raz i obsługuje tysiące requestów bez restartu. Wynik: 5-10x więcej requestów na sekundę. Artykuł pokazuje instalację z RoadRunner (prościej) i Swoole (wydajniej), zarządzanie shared state i konfigurację produkcyjną z Nginx.

## Instalacja Laravel Octane z RoadRunner

\# Wymagania: Laravel 9+, PHP 8.1+, VPS (hosting wspoldzielony NIE dziala)
# Instalacja pakietu
composer require laravel/octane

# Inicjalizacja — wybierz RoadRunner lub Swoole
php artisan octane:install
# Wybierz: roadrunner

# Octane pobiera binary RoadRunner automatycznie
# Sprawdz czy binary jest gotowe:
ls -la rr    # powinno byc: ./rr (executable)

# Konfiguracja w config/octane.php jest generowana automatycznie
# Kluczowe ustawienia:
# 'server' => env('OCTANE\_SERVER', 'roadrunner'),
# 'workers' => env('OCTANE\_WORKERS', null),  # null = auto (liczba CPU)
# 'max\_requests' => env('OCTANE\_MAX\_REQUESTS', 500), # restart po N requestach

# Start w trybie dev
php artisan octane:start --watch  # --watch: restart po zmianie plikow

# Sprawdz potencjalne problemy shared state
php artisan octane:check

## Instalacja z Swoole (alternatywna, wyższa wydajność)

\# Wymagania: PHP 8.1+ z rozszerzeniem swoole
# Ubuntu/Debian — instalacja Swoole przez PECL
sudo apt install php8.2-dev php-pear
sudo pecl install swoole

# Lub przez repo ondrej/php (latwiej)
sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.2-swoole

# Weryfikacja
php -m | grep swoole
php -r "phpinfo();" | grep -i swoole

# Konfiguracja w php.ini (dodaj jesli brakuje)
# extension=swoole
# swoole.use\_shortname = Off  # Wymagane przez Laravel

# Instalacja Octane z Swoole
php artisan octane:install
# Wybierz: swoole

# Opcje Swoole w config/octane.php:
# 'swoole' => \[
#     'options' => \[
#         'max\_request' => 500,
#         'dispatch\_mode' => 2,        # round-robin
#         'reactor\_num' => 2,           # I/O reactor threads
#         'worker\_num' => 4,            # workery PHP
#         'task\_worker\_num' => 2,       # task workers (dla queue)
#     \],
# \],

## Shared State — najważniejszy problem Octane

PHP-FPM resetuje cały stan po każdym requeście. Octane tego nie robi — worker żyje przez setki requestów. Singleton zarejestrowany w AppServiceProvider może "wyciec" między requestami. Laravel Octane automatycznie resetuje kilka singletons (Auth, Session, Cookie), ale własny kod może mieć problemy.

// PROBLEM: singleton przechowujacy stan per-request
class UserContext {
    private ?User $user = null;

    // Singleton — ta instancja zyje przez caly czas zycia workera
    public function setUser(User $user): void {
        $this->user = $user;
    }
    public function getUser(): ?User {
        return $this->user;  // WYCIEK! Poprzedni user bedzie widoczny w nastepnym requeście
    }
}

// ROZWIAZANIE 1: Nie uzywa singletonu — tworz nowa instancje per request
// W AppServiceProvider:
$this->app->bind(UserContext::class);  // bind zamiast singleton

// ROZWIAZANIE 2: Uzyj hooka terminating w Octane
use Laravel\\Octane\\Facades\\Octane;

Octane::tick('clear-user-context', function () {
    app(UserContext::class)->clear();
})->seconds(0);  // po kazdym requeście

// ROZWIAZANIE 3: Reset w ServiceProvider
// W AppServiceProvider::boot():
$this->callAfterResolving('user-context', function ($context, $app) {
    if ($app->runningInOctane()) {
        Octane::onRequestTerminated(fn() => $context->clear());
    }
});

// BEZPIECZNE WZORCE w Octane:
// ✓ Fasady (facade proxy do kontenera — OK)
// ✓ Eloquent modele (nowe instancje per query)
// ✓ request() helper (Octane podmienia per request)
// ✓ auth() / Auth:: (resetowane przez Octane)
// ✗ Klasy z statycznymi wlasciwosciami (static $cache = \[\])
// ✗ Wlasne singletons z mutowalnym stanem

## Warm-up routines — przyspieszenie startu

// Warm-up w config/octane.php — wstepne ladowanie klas do pamieci
'warm' => \[
    ...Octane::defaultServicesToWarm(),
    // Dodaj wlasne klasy które sa uzywane przy kazdym requeście
    App\\Services\\PricingService::class,
    App\\Repositories\\ProductRepository::class,
    App\\Http\\Middleware\\TrustProxies::class,
\],

// Wlasny warm-up — np. cache danych ze swiata rzeczywistego
'listeners' => \[
    WorkerStarting::class => \[
        EnsureUploadDirectoriesExist::class,
        // Wlasny listener
        App\\Listeners\\WarmApplicationCache::class,
    \],
\],

// App\\Listeners\\WarmApplicationCache:
class WarmApplicationCache {
    public function handle(WorkerStarting $event): void {
        // Wstepne zaladowanie najczesciej uzywanych konfiguracji do cache
        Cache::remember('site\_settings', 3600, fn() => Setting::all());
    }
}

## Systemd + Nginx — konfiguracja produkcyjna

\# /etc/systemd/system/laravel-octane.service
\[Unit\]
Description=Laravel Octane
After=network.target

\[Service\]
User=www-data
Group=www-data
WorkingDirectory=/var/www/myapp
ExecStart=/usr/bin/php artisan octane:start \\
    --server=roadrunner \\
    --host=127.0.0.1 \\
    --port=8000 \\
    --workers=4 \\
    --max-requests=500
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
TimeoutStopSec=30
Restart=on-failure
RestartSec=5

\[Install\]
WantedBy=multi-user.target

# Nginx — reverse proxy do Octane
# /etc/nginx/sites-available/laravel-octane
server {
    listen 443 ssl http2;
    server\_name example.com;

    ssl\_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl\_certificate\_key /etc/letsencrypt/live/example.com/privkey.pem;

    root /var/www/myapp/public;
    index index.php;

    # Pliki statyczne bezposrednio przez Nginx
    location ~\* \\.(css|js|gif|ico|jpg|png|svg|woff2|woff|ttf)$ {
        expires 1y;
        add\_header Cache-Control "public, immutable";
        try\_files $uri =404;
    }

    # Octane obsluguje wszystko inne
    location / {
        proxy\_pass http://127.0.0.1:8000;
        proxy\_set\_header Host $host;
        proxy\_set\_header X-Real-IP $remote\_addr;
        proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
        proxy\_set\_header X-Forwarded-Proto $scheme;
        proxy\_read\_timeout 60s;
    }
}

# Wlaczenie i restart
sudo systemctl daemon-reload && sudo systemctl enable --now laravel-octane

## Benchmarki vs PHP-FPM

Środowisko

Req/s (avg)

Latency P95

RAM per worker

PHP-FPM (klasyczny)

~800 req/s

~45 ms

~30 MB

Octane RoadRunner (4 workers)

~5 500 req/s

~8 ms

~80 MB

Octane Swoole (4 workers)

~6 200 req/s

~7 ms

~90 MB

Wyniki orientacyjne dla prostego endpointu JSON. Realne aplikacje z bazą danych i złożoną logiką zyskują mniej — ale nadal 3-5x. Większe zużycie RAM to cena za trzymanie aplikacji w pamięci.

## Najczęstsze pytania

Ile razy szybszy jest Laravel Octane od PHP-FPM? +

W benchmarkach Laravel Octane z RoadRunner lub Swoole jest 5-10x szybszy niż tradycyjny PHP-FPM przy obsłudze prostych requestów. Główny powód: Octane ładuje aplikację (ServiceProvider, DI container) raz do pamięci i obsługuje kolejne requesty bez przeładowania. PHP-FPM ładuje całą aplikację od zera przy każdym requeście. Przy aplikacjach z rozbudowanym bootstrapingiem (wiele service providerów) różnica jest jeszcze większa.

RoadRunner vs Swoole — który wybrać? +

RoadRunner to binary napisany w Go — łatwa instalacja (jeden plik), nie wymaga rozszerzenia PHP, działa na VPS bez root dla kompilacji. Swoole to rozszerzenie PHP (PECL) — wymaga kompilacji, ale daje natywne coroutines i lepszą integrację z ekosystemem PHP. Jeśli nie masz doświadczenia z instalacją rozszerzeń PHP, zacznij od RoadRunner. Jeśli używasz coroutines i wbudowanych serwerów Swoole (WebSocket, HTTP), wybierz Swoole. Wydajność obu jest porównywalna.

Jakie problemy ze shared state grożą przy Octane? +

Największe ryzyko to singleton state — jeśli cokolwiek w Service Provider lub Singleton cache przechowuje stan zależny od konkretnego requesta (np. user z Auth::user(), request data, Eloquent scope), ten stan "wycieknie" do następnego requesta. Octane resetuje wspólne singletons między requestami, ale musisz sprawdzić własny kod. Użyj php artisan octane:check do wykrycia potencjalnych problemów. Szczególnie uważaj na statyczne właściwości klas i własne singletons rejestrowane w AppServiceProvider.

Czy Octane działa na hostingu współdzielonym? +

Nie. Laravel Octane wymaga długo działającego procesu CLI (php artisan octane:start) — tego hosting współdzielony z PHP-FPM nie obsługuje. Octane działa wyłącznie na VPS, serwerze dedykowanym lub PaaS (Railway, Fly.io). Minimalne wymagania: VPS z 1 GB RAM, PHP 8.1+ i możliwością uruchomienia procesów w tle (systemd lub supervisor).

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS pod Laravel Octane — 4+ GB RAM dla wielu workerów

VPS + RAM

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

home.pl

Polskie VPS pod aplikacje Laravel z PHP 8.2

VPS PL

[Aktywuj rabat →](/out/home-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/home-pl)

ProSerwer.pl

VPS NVMe pod Laravel Octane — niskie latency I/O

NVMe VPS

[Aktywuj rabat →](/out/proserwer-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/proserwer)

## Powiązane strony

-   [Laravel na hostingu — shared hosting i VPS](/baza-wiedzy/laravel-na-hostingu)
-   [PHP-FPM — konfiguracja puli procesów](/baza-wiedzy/php-fpm-konfiguracja-optymalizacja)
-   [Nginx — konfiguracja virtual hosts na VPS](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [Wszystkie artykuły](/baza-wiedzy/)