Preskočiť na obsah
Laravel DevOps 23. jún 2026 · 10 min čítania

Laravel Octane výkon na maximum

Klasický PHP-FPM model naštartuje celý Laravel kernel pri každom jednom requeste — načíta service providery, zostaví container, zahodí všetko po odpovedi. Octane appku naštartuje raz a udrží ju v pamäti medzi requestmi. Výsledok je rádovo nižšia latencia, ale aj nová kategória chýb, ktorú klasický PHP-FPM nepoznal: zdieľaný stav medzi požiadavkami rôznych užívateľov.

DC

Dušan Chlpek

PHP vývojár, GEAR s.r.o. · 25+ rokov praxe

Čo presne Octane mení

Pri klasickom PHP-FPM requeste sa pri každom volaní vykoná: autoload tried, registrácia a boot všetkých service providerov, zostavenie service container, spustenie middleware pipeline. Pri jednoduchom JSON endpointe je táto bootstrap fáza často drahšia než samotná business logika.

Laravel Octane appku naštartuje jeden raz a uloží ju do pamäte dlhotrvajúceho procesu (Swoole, RoadRunner alebo FrankenPHP). Každý ďalší request len prejde cez už zostavený container — bootstrap sa neopakuje. Cenou je, že sa musíte sami postarať o vyčistenie stavu medzi requestmi, ktoré by inak PHP-FPM zahodil automaticky ukončením procesu.

Swoole vs. RoadRunner vs. FrankenPHP

RuntimeJazyk jadraInštaláciaOdporúčanie
SwooleC (PHP extension)pecl install swooleNajrýchlejší, vyžaduje kompiláciu rozšírenia
RoadRunnerGo (samostatný binárny proces)Stiahnutie binárky, žiadna kompilácia PHPNajjednoduchšia inštalácia na zdieľanom VPS
FrankenPHPGo + PHP (jeden binárny server)Jeden statický binár, nahradí aj NginxNajnovšia voľba, výborná pre Docker

Pre väčšinu projektov na VPS odporúčam RoadRunner — nevyžaduje kompiláciu PHP rozšírenia a má jednoduchší deployment. Swoole má o niečo vyšší strop výkonu a podporuje coroutines pre konkurentné úlohy.

Inštalácia

composer require laravel/octane

# Interaktívne vyberie server (Swoole / RoadRunner / FrankenPHP)
php artisan octane:install

Pre RoadRunner príkaz stiahne binárku rr do koreňa projektu. Server zvoľte aj explicitne v .env:

OCTANE_SERVER=roadrunner

Spustenie a konfigurácia workerov

# Vývoj
php artisan octane:start

# Produkcia — počet worker procesov podľa CPU jadier
php artisan octane:start --workers=4 --task-workers=2 --port=8000

--workers určuje počet procesov, ktoré spracúvajú HTTP requesty paralelne. --task-workers je oddelený pool pre asynchrónne úlohy spustené cez Octane::concurrently() — vhodné napríklad na paralelné API volania bez blokovania hlavného workera.

Najväčšie úskalie: zdieľaný stav medzi requestmi

V klasickom PHP-FPM modeli sa po každom requeste celá pamäť procesu zahodí. V Octane appka žije ďalej — a s ňou aj všetko, čo ste si nechtiac uložili do statickej premennej alebo singletonu.

// NEBEZPEČNÉ v Octane — pole rastie pri každom requeste a nikdy sa nevyprázdni
class RequestLogger
{
    public static array $log = [];

    public function record(string $message): void
    {
        self::$log[] = $message; // Po tisíckach requestov zožerie všetku RAM
    }
}
// NEBEZPEČNÉ — singleton si „zapamätá" prvého užívateľa pre všetky ďalšie requesty
$this->app->singleton(CurrentTenant::class, function () {
    return new CurrentTenant(auth()->user()?->tenant_id); // Vyhodnotené len raz!
});
Pozor: Service container resetuje bežné bindingy medzi requestmi automaticky, ale statické premenné triedy a singletony zaregistrované s dátami vypočítanými pri boote appky pretrvávajú. Ak singleton potrebuje dáta špecifické pre request (napr. prihlásený užívateľ), riešte to scoped bindingom alebo middleware, ktorý dáta nastaví na začiatku každého requestu.
// app/Providers/AppServiceProvider.php
public function boot(): void
{
    // Vyčistenie vlastného stavu medzi requestmi
    if (class_exists(\Laravel\Octane\Facades\Octane::class)) {
        \Laravel\Octane\Facades\Octane::tick('clear-static-log', function () {
            RequestLogger::$log = [];
        })->seconds(60);
    }
}

Čo Octane resetuje automaticky, a čo nie

Nasadenie na produkciu: Nginx + systemd

Octane proces musí bežať ako démon. Nginx pred ním slúži ako reverse proxy a zabezpečuje SSL terminovanie — rovnaký princíp ako pri nasadení Laravel Reverb.

# /etc/systemd/system/laravel-octane.service
[Unit]
Description=Laravel Octane Application Server
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
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
# /etc/nginx/sites-available/myapp
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;
}
Tip: Po každom nasadení novej verzie kódu je nutný reštart Octane procesu (systemctl restart laravel-octane) — appka bežiaca v pamäti inak ďalej obsluhuje starý kód. Zaraďte tento krok do CI/CD pipeline, ktorú rozoberám v článku o automatickom nasadení cez GitHub Actions.

Kedy Octane nie je vhodný

Záver: checklist pred nasadením

Potrebujete zrýchliť existujúcu Laravel aplikáciu?

Nasadím Octane, doladím cache stratégiu a queue workery tak, aby aplikácia zvládla vyššiu záťaž bez zmeny servera. Dopyt bez záväzkov, odpoveď do 24 hodín.

Ďalšie články

Zavolať E-mail Dopyt

Ochrana súkromia

Táto stránka využíva cookies pre nevyhnutné fungovanie. Rešpektujeme vaše súkromie a legislatívu GDPR.