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 без змін у коді?
Зазвичай ні: потрібен аудит коду на статичний стан і сервіси, які припускають, що процес живе один запит, а не весь термін життя воркера.