До основного вмісту

Laravel Octane на VDS: коли він дає вигоду

PHP · 18.10.2026 · 4 хв читання
Ілюстрація до статті «Laravel Octane на VDS: коли він дає вигоду»

Laravel Octane тримає застосунок завантаженим у пам'яті між запитами через Swoole, RoadRunner чи FrankenPHP, уникаючи повторного завантаження контейнера і сервіс-провайдерів на кожен запит. Це не універсальне прискорення, а інструмент для конкретного вузького місця — вартості бутстрапа фреймворка, і він додає новий клас помилок, про який нижче.

Коли Octane дає вигоду, а коли не потрібен

Вигода помітна там, де бутстрап фреймворка — помітна частка часу запиту: короткі API-ендпоінти з простою бізнес-логікою і високою частотою запитів. Там, де відповідь визначають запити до бази даних, зовнішні API чи важкий рендеринг шаблонів, частка бутстрапа в загальному часі і так мала, і Octane майже нічого не змінює.

Octane потребує ядер CPU, які постійно зайняті резидентними воркерами, на відмінну від пулу PHP-FPM, який можна тримати в режимі dynamic чи ondemand. Базова установка Laravel на VPS з Nginx описана в статті про Laravel на VPS — Octane замінює в цій схемі обробку HTTP-запитів через сокет FPM на власний сервер, який Nginx проксує окремо.

Вибір драйвера: Swoole чи RoadRunner

Swoole — це розширення PHP, яке потрібно зібрати чи поставити через PECL; воно дає корутини і вбудований HTTP-сервер. RoadRunner — окремий бінарник на Go, який обмінюється даними з PHP-воркерами через сокет і не вимагає компіляції розширення, тому легше ставиться на керований VDS. Різницю між ними і корутинами Swoole в черзі розібрано в статті про Swoole і RoadRunner.

Від JIT в OPcache Octane вигравaє менше, ніж очікують: класи компілюються один раз під час старту воркера в обох режимах — і в FPM, і в Octane, — тому базовий OPcache важливіший за JIT. Налаштування розібрано в статті про OPcache і JIT.

Скільки воркерів запускати

Стартова точка — кількість воркерів дорівнює кількості доступних ядер CPU мінус одне ядро, зарезервоване під ОС та інші сервіси: на VDS з 4 ядрами це 3 воркери. На відмінну від pm.max_children, тут не вийде просто збільшувати кількість процесів під обсяг RAM — кожен воркер займає ядро на час обробки запиту, а не чекає I/O так легко, як процес FPM.

  • Синхронні HTTP-виклики без корутин блокують воркер на весь час очікування відповіді
  • Важка синхронна обробка зображень чи регулярних виразів займає ядро цілком
  • Блокувальний драйвер сесій чи кешу сповільнює кожен запит у воркері
  • Накопичення витоків пам'яті в статичних властивостях змушує перезапускати воркер частіше
  • Ліміт підключень до бази даних на кожен воркер обмежує паралелізм

Таблиця: запит у FPM проти воркера Octane

Таблиця показує різницю в життєвому циклі запиту, а не числа продуктивності — їх варто вимірювати на власному навантаженні.

ПараметрPHP-FPM (класичний)Laravel Octane
Завантаження фреймворкана кожен запитодин раз при старті воркера
Скидання стану між запитамиповне, новий процесвручну, через сервіс-провайдери
Статичні властивості і singletonне накопичуютьсяможуть накопичуватися між запитами
Перезапуск воркерапісля pm.max_requestsпісля max-requests Octane чи octane:reload

Конфігурація і перезапуск воркерів

Octane запускається однією командою з явною кількістю воркерів і лімітом запитів на воркер — за аналогією з pm.max_requests це гігієнічний перезапуск, який обмежує накопичений витік пам'яті, а не ознака поламки.

php artisan octane:start --server=swoole --host=0.0.0.0 --port=8000 --workers=3 --task-workers=2 --max-requests=500

Типові помилки під час переходу на Octane

Найнебезпечніша помилка — зберігати дані конкретного запиту у статичній властивості класу чи в singleton-біндингу контейнера: у FPM це безпечно, бо процес живе один запит, а в Octane таке значення залишається в пам'яті воркера і може потрапити у відповідь наступному, випадковому користувачу.

Друга типова помилка — виставити порт Octane прямо в інтернет. Власний HTTP-сервер Octane не замінює Nginx: зворотний проксі зі статті про Laravel на VPS залишається потрібним для TLS, обмеження швидкості запитів і статики.

Часті питання

Чи потрібно прибирати PHP-FPM, якщо поставили Octane?

Ні: FPM зазвичай залишається для cron-завдань, artisan-команд і черг, які не проходять через HTTP-цикл Octane — він замінює лише обробку веб-запитів.

Скільки пам'яті потрібно Octane порівняно з FPM?

Кожен воркер тримає завантажений фреймворк у пам'яті весь час свого життя, тому базове споживання вище, ніж у процесу FPM, що простоює; точне число варто вимірювати тим самим способом RSS, що і для звичайного пулу.

Чи можна увімкнути Octane без змін у коді?

Зазвичай ні: потрібен аудит коду на статичний стан і сервіси, які припускають, що процес живе один запит, а не весь термін життя воркера.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці