Документация/Запуск приложения/RoadRunner

RoadRunner

RoadRunner — это высокопроизводительный сервер приложений PHP, балансировщик нагрузки и менеджер процессов.
RoadRunner написан на языке Go, он прост в установке, по принципу действия заменяет собой PHP-FPM. Поддерживает xDebug и его аналоги, а также инструменты профилирования и мониторинга, такие как Datadog и New Relic. Подробнее в документации RoadRunner.

Для правильной работы приложения, запущенного при помощи этой технологии, оно должно быть разработано с поддержкой асинхронного режима.

В асинхронном режиме переиспользуются загруженные конфигурации фреймворка, классы, инициализированные сервисы, кешированные данные, что значительно ускоряет работу.
Но вместе с этим есть характерные особенности, такие как необходимость больше следить за утечками памяти и устранять блокирующие операции, также многие из привычных сторонних библиотек не поддерживают асинхронный режим.
Хранение состояния (state) в логических частях приложения становится нежелательным, особенно, если оно связано с запросом.

Установка ресурсов сервера RoadRunner производится из официального репозитория: github.com/roadrunner-server/roadrunner.

Под RoadRunner необходимо будет изменить файл /public/index.php, чтобы фреймворк HLEB2 выполнялся в цикле.
Базовый рабочий пример:

<?php
// File /public/index.php

use Spiral\RoadRunner;
use 
Nyholm\Psr7;

ini_set('display_errors''stderr');

include 
__DIR__ "/../vendor/autoload.php";

$worker RoadRunner\Worker::create();
$psrFactory = new Psr7\Factory\Psr17Factory();

$psr7 = new RoadRunner\Http\PSR7Worker($worker$psrFactory$psrFactory$psrFactory);

// Framework initialization outside the loop.
$framework = new Hleb\HlebAsyncBootstrap(__DIR__);

while (
$request $psr7->waitRequest()) {
    try {
        
// Getting an object with a response.
        
$response $framework->load($request)->getResponse();

        
// Convert the framework response to a handler format.
        
$psr7->respond(new Psr7\Response(...$response->getArgs()));

    } catch (
\Throwable $e) {
        
$psr7->respond(new Psr7\Response(500, [], 'Something Went Wrong!'));
        
$framework->errorLog($e);
    }
}

Для RoadRunner также нужно создать конфигурационный файл .rr.yaml в корневой директории проекта (предполагается, что скомпилированный файл сервера c названием rr находится там же).
Пример минимальной рабочей конфигурации в .rr.yaml:

version: '3'
server:
    command: 'php ./public/index.php'
http:
    address: :8088
    middleware:
        - gzip
        - static
    static:
        dir: public
        forbid:
            - .php
            - .htaccess
    pool:
        num_workers: 6
        max_jobs: 64
        debug: false
        supervisor:
            max_worker_memory: 5
metrics:
    address: '127.0.0.1:2113'

В данной конфигурации RoadRunner работа одного процесса (воркера) ограничена по выставленному максимуму допустимой памяти в настройках: http.pool.supervisor.max_worker_memory в мегабайтах. Поэтому, если процесс превысил этот лимит, RoadRunner его правильно завершает и приступает к следующему.

Сервер RoadRunner запускается консольной командой:

$./rr serve

Согласно конфигурации, приложение будет доступно по адресу:
http://localhost:8088

Метрики работы сервера в формате Prometheus:
http://localhost:2113

Запуск с помощью Apache Сервер Swoole

Страница создана: @fomiash
К началу страницы