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

WebRotor

WebRotor — это PHP библиотека с помощью которой можно использовать асинхронное выполнение приложения на общем хостинге. Как известно, shared hosting обладает множеством ограничений по использованию, но такая специализированная программа дает все преимущества асинхронности и на общем хостинге.

Принцип работы WebRotor в том, что при обращении к приложению индексный файл не обрабатывает запросы, а только посылает воркерам и забирает обратно для отображения. При этом в качестве воркера используется код этого же индексного файла. В качестве воркеров выступают обычные CRON-подобные процессы, имеющиеся сейчас на каждом хостинге. Разница настройки этих воркеров только в различии дизайна административной панели хостинга.

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

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

Интерфейс RollbackInterface фреймворка предназначен для сброса состояния после каждого асинхронного запроса.

Для WebRotor необходимо будет изменить файл /public_html/index.php (предполагаемый путь к индексному файлу на общем хостинге), чтобы фреймворк HLEB2 выполнялся в цикле. Базовый рабочий пример:

<?php
// File /public_html/index.php

use Phphleb\Webrotor\Config;
use 
Phphleb\Webrotor\Src\Handler\NyholmPsr7Creator;
use 
Phphleb\Webrotor\WebRotor;
use 
Psr\Http\Message\ResponseInterface;
use 
Psr\Http\Message\ServerRequestInterface;

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

$psr7Creator = new NyholmPsr7Creator(); // or GuzzlePsr7Creator()

$config = new Config();
$config->logLevel 'warning';
$config->workerNum 2// Must correspond to the number of workers
$config->workerLifetimeSec 120// Must correspond to the worker launch interval
$config->runtimeDirectory __DIR__ '/../storage/wr-runtime';
$config->logDirectory __DIR__ '/../storage/wr-logs';

$server = new WebRotor($config);
$server->init($psr7Creator);

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

$server->run(function(ServerRequestInterface $requestResponseInterface $response) use ($framework) {
    
$res $framework->load($request)->getResponse();

    
$response->getBody()->write($res->getBody());
    foreach(
$res->getHeaders() as $name => $header) {
        
$response $response->withHeader($name$header);
    }
    return 
$response->withStatus($res->getStatus());
});

В данном коде используется HTTP-клиент nyholm/psr7 и nyholm/psr7-server, которые нужно установить дополнительно.

Для такой конфигурации нужно еще будет запустить "воркеры" на хостинге, которые на самом деле предоставляемые хостингом CRON-подобные процессы. Обычно они настраиваются в административной панели хостинга и имеют различный дизайн, но принцип у них будет один. Нужно запустить два обработчика с интервалом в две минуты (в соответствии с настройками указанными выше):

*/2 * * * * /usr/local/bin/php7.2 /my-project/public_html/index.php --id=1

*/2 * * * * /usr/local/bin/php7.2 /my-project/public_html/index.php --id=2

Два этих процесса отличаются только номером ID для воркера. После этого все запросы, поступающие к приложению будут обрабатываться двумя асинхронными воркерами.
Подробнее в описании библиотеки: github.com/phphleb/webrotor

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

Shared hosting Маршрутизация

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