Laravel Octane — це розширення, яке дозволяє запускати додаток Laravel на асинхронних серверах, усуваючи витрати на ініціалізацію фреймворка при кожному запиті. Два найпопулярніші режими — Swoole і RoadRunner — відрізняються архітектурою, вимогами до середовища та характеристиками продуктивності. У цій статті ми проведемо порівняння Laravel Octane Swoole і RoadRunner, наведемо конкретні приклади конфігурації та обговоримо підводні камені використання Swoole в Laravel і оптимізацію пам’яті Laravel Octane.
Архітектура Swoole vs RoadRunner
Swoole — це розширення PHP, написане на C, яке запускає власний event‑loop і керує TCP/HTTP‑з’єднаннями на рівні операційної системи. Працює як багатопотоковий сервер, у якому кожен worker має власний процес, схожий на PHP‑FPM, але зберігає пам’ять між запитами. RoadRunner, навпаки, є проміжним сервером, заснованим на Go. Він приймає HTTP‑запити, передає їх процесу PHP (worker) і після завершення повертає результат, після чого worker залишається в пам’яті, готовий до наступних викликів.
Ключова різниця полягає в тому, що Swoole керує як мережевим рівнем, так і виконанням коду PHP, що дозволяє використовувати coroutine і забезпечує низьку затримку I/O. RoadRunner делегує мережеву обробку Go, що зменшує кількість залежностей у PHP‑середовищі, але додає додатковий рівень міжпроцесної комунікації.
Чому обирати Octane?
Традиційний PHP‑FPM створює новий екземпляр додатку при кожному запиті. Це створює значне навантаження — завантаження файлів, реєстрація сервісів, компіляція контейнерів. Octane усуває цей витрат, тримаючи додаток у пам’яті, що на практиці дає 2‑3‑разове прискорення часу відповіді при типових навантаженнях API.
Проте ці переваги приходять з новими викликами: пам’ять не звільняється після кожного запиту, а деякі компоненти Laravel (наприклад, файлові сесії) за замовчуванням не пристосовані до тривалого життя процесу. Тому важливо розуміти компроміси продуктивності та архітектури перед впровадженням.
Конфігурація на практиці — Swoole
composer require laravel/octane
php artisan octane:install --server=swoole
# файл .env
OCTANE_SERVER=swoole
OCTANE_WORKERS=8
OCTANE_MAX_REQUESTS=500
OCTANE_MAX_EXECUTION_TIME=30
Після встановлення найважливіші параметри — це OCTANE_WORKERS (кількість процесів‑workerів) та OCTANE_MAX_REQUESTS, які визначають, після скількох запитів worker буде перезапущений, щоб звільнити використану пам’ять. Для додатків з інтенсивним використанням кешу в пам’яті варто встановити нижче значення, щоб уникнути витоків.
Конфігурація на практиці — RoadRunner
# composer require spiral/roadrunner laravel/octane
php artisan octane:install --server=roadrunner
# файл .rr.yaml
rpc:
listen: tcp://127.0.0.1:6001
http:
address: 0.0.0.0:8080
workers:
command: "php worker.php"
relay: "pipes"
pool:
numWorkers: 8
maxJobs: 500
RoadRunner вимагає окремого конфігураційного файлу .rr.yaml. Параметр numWorkers відповідає кількості процесів PHP, а maxJobs виконує аналогічну роль до OCTANE_MAX_REQUESTS у Swoole. Додатково RoadRunner пропонує вбудовану підтримку static files та gzip, що може зняти навантаження з додатку.
Коли використовувати Swoole, а коли RoadRunner?
- Swoole — ідеальний, коли потрібна низька затримка I/O, підтримка WebSocket‑ів і coroutine. Підходить для мікросервісів, real‑time API та додатків, що вимагають високої пропускної здатності.
- RoadRunner — кращий вибір, коли ви хочете мінімізувати системні залежності (відсутність розширення Swoole), вже маєте інфраструктуру Go або потребуєте простого розгортання в Docker‑контейнерах.
Обидва рішення чудово працюють у середовищах Kubernetes, але Swoole вимагає додаткового кроку встановлення розширення (pecl install swoole) у образі контейнера, що може подовжити CI/CD.
Підводні камені використання Swoole в Laravel
Найчастіші проблеми:
- Неправильне управління з’єднаннями до бази даних — з’єднання не закриваються автоматично після запиту, що призводить до вичерпання пулу. Рішення: у
AppProvidersAppServiceProvider::boot()зареєструйте listenerOctane::terminatingі викличтеDB::disconnect(). - Кеш у пам’яті (
arraydriver) не спільний між worker‑ами, що може викликати несумісності. Використовуйтеredisабоmemcached. - Статичні глобальні змінні та синглтони не скидаються після перезапуску worker‑ів, що може призвести до застарілих даних у пам’яті.
Рішення включають точне очищення стану у хуці Octane::restarting та обмеження використання статичних властивостей.
Оптимізація пам’яті Laravel Octane
Ключові техніки:
- Встановіть
OCTANE_MAX_REQUESTSу діапазон 300‑500, щоб регулярно оновлювати пам’ять воркерів. - Увімкніть
opcache.preloadуphp.ini, щоб прискорити завантаження класів під час запуску воркерів. - Використовуйте
php artisan config:cacheіroute:cache– Octane працює з вже закешованими файлами, що знижує навантаження CPU.
Контролюйте використання пам’яті за допомогою top або htop та інструментів типу Octane::stats(), які повертають інформацію про кількість активних воркерів і споживання пам’яті.
«Продуктивність – це не лише цифри, а здатність зберігати стабільність при зростаючому навантаженні.»
Checklist – впровадження Laravel Octane у продакшн
# 1. Вибір сервера
# - Swoole: потрібне розширення, кращий I/O
# - RoadRunner: без розширень, простіший Docker
# 2. Конфігурація середовища
OCTANE_SERVER=swoole # або roadrunner
OCTANE_WORKERS=8
OCTANE_MAX_REQUESTS=400
OCTANE_MAX_EXECUTION_TIME=30
# 3. Безпечні з’єднання DB
use Laravel\Octane\Facades\Octane;
Octane::terminating(function () {
DB::disconnect();
});
# 4. Кеш і сесії
CACHE_DRIVER=redis
SESSION_DRIVER=redis
# 5. Оптимізації
php artisan config:cache
php artisan route:cache
php artisan view:cache
# 6. Моніторинг
php artisan octane:stats --watch
Після застосування наведеної чек‑лісти, додаток має працювати стабільно при високому RPS. Пам’ятайте регулярно тестувати max_requests у staging‑середовищі, оскільки відмінності у продакшн‑даних можуть впливати на споживання пам’яті.
Типові помилки та компроміси
Впровадження Octane часто створює хибне відчуття, що «продуктивність вже максимальна». Насправді:
- Використання
session: fileвикликає блокування файлів у довгоживучих воркерах – перейдіть на Redis. - Розгорнуті події у
boot()можуть викликатися при кожному запиті, хоча не повинні – перенесіть їх уOctane::bootingабоOctane::reloading. - Не всі пакети сумісні з довготривалими процесами (наприклад, деякі бібліотеки SOAP). Тестуйте їх окремо.
Компроміси включають підвищене споживання пам’яті (кожен воркер тримає повний контейнер Laravel) в обмін на менший час відповіді. У середовищах з обмеженою пам’яттю краще зменшити кількість воркерів і частіше їх перезапускати.
Підсумовуючи, вибір між Swoole та RoadRunner залежить від специфіки вашого проєкту – потреб у реальному часі, доступності ресурсів та операційних уподобань. Обидва рішення значно підвищують продуктивність Laravel Octane, за умови правильної конфігурації та усвідомлення виробничих підводних каменів.
Якщо потрібна допомога з міграцією до Octane, оптимізацією пам’яті або побудовою масштабованої архітектури, зв’яжіться з командою Coderia.it – разом прискоримо ваш код.



