Быстрый старт
Это руководство запускает приложение в режиме Classic и переводит его в режим Worker. Затем оно сохраняет настройки в файле конфигурации. Для выполнения шагов нужен рабочий бинарник rapira с PHP из комплекта. См. раздел Установка.
Режим Classic
Режим Classic доступен любому приложению. Rapira подключает входной скрипт для каждого запроса, как php-fpm. Изменять код не нужно.
Создайте public/index.php:
<?php
header('Content-Type: text/plain');
echo "Hello, " . ($_GET['name'] ?? 'anonymous') . "!\n";
echo "Method: {$_SERVER['REQUEST_METHOD']}\n";Создайте rapira.toml рядом с каталогом public. Ключ mode выбирает режим Classic, а entrypoint задаёт входной скрипт:
[http]
listen = "127.0.0.1:8000"
[http.pool]
entrypoint = "public/index.php"
mode = "classic"Запустите сервер с путём к файлу:
rapira serve rapira.tomlRapira слушает 127.0.0.1:8000. Отправьте запрос из другого терминала:
curl '127.0.0.1:8000/?name=world'Hello, world!
Method: GETПроцессы воркеров остаются активными между запросами. Rapira создаёт воркеры один раз и сохраняет инициализированный интерпретатор PHP в каждом воркере. Режим Classic удаляет состояние скрипта после каждого запроса. Это состояние включает переменные, автозагрузчик и объекты фреймворка.
Режим Worker
Режим Worker сохраняет скрипт активным. Скрипт инициализируется один раз и затем ожидает запросы в цикле. Для каждого запроса Rapira снова заполняет суперглобальные переменные и вызывает обработчик. PHP по-прежнему может читать $_GET и создавать ответ через echo. См. раздел Режимы выполнения.
Создайте worker.php в корне проекта:
<?php
// This value remains available for each request in this worker.
$handled = 0;
$handler = static function () use (&$handled): void {
$handled++;
header('Content-Type: text/plain');
echo "Hello, " . ($_GET['name'] ?? 'anonymous') . "!\n";
echo "worker " . getmypid() . " handled {$handled} request(s)\n";
};
while (\Rapira\handle_request($handler)) {
gc_collect_cycles();
}\Rapira\handle_request() ожидает следующий запрос. Функция вызывает обработчик и возвращает true. Во время остановки воркера она возвращает false, что завершает цикл.
Обработчик читает суперглобальные переменные и отвечает через echo и header(). Вызывайте \Rapira\handle_request() только в цикле верхнего уровня скрипта. В других режимах функция бросает Rapira\Exception\NotInWorkerModeError.
PHP-модуль, который регистрирует Rapira, предоставляет \Rapira\handle_request(). Поэтому пример не требует автозагрузчика. Приложение с зависимостями Composer должно подключить vendor/autoload.php перед циклом.
Остановите сервер Classic с помощью Ctrl-C, потому что оба сервера используют адрес 127.0.0.1:8000. Измените rapira.toml на режим Worker:
[http]
listen = "127.0.0.1:8000"
[http.pool]
entrypoint = "worker.php"
mode = "worker"rapira serve rapira.tomlcurl '127.0.0.1:8000/?name=world'Выполните команду curl несколько раз. Счётчик конкретного воркера увеличивается, когда этот процесс обрабатывает следующий запрос. По умолчанию Rapira определяет число воркеров по числу доступных процессоров. Операционная система выбирает воркер для каждого соединения. У каждого воркера есть отдельный счётчик. Идентификатор процесса в ответе показывает, какой воркер вернул ответ.
Задайте processes = 1 в [http.pool], чтобы создать один воркер. Надзор за пулом описан в разделе Модель процессов.
Объекты, созданные перед циклом while, остаются в памяти до перезапуска скрипта воркера. К ним относятся автозагрузчик Composer, контейнер, соединения, маршруты и шаблоны. Rapira инициализирует это состояние один раз, а не для каждого запроса. Только состояние запроса создаётся для каждой итерации.
Скрипт воркера должен сбрасывать состояние запроса, которое остаётся в памяти. К этому состоянию относятся статические свойства, глобальные значения и открытые транзакции. См. раздел Режим Worker.
Обработчик может вызвать rapira_finish_request(), чтобы отправить ответ до завершения обработчика. См. раздел HTTP.
Файл конфигурации
Файл конфигурации содержит все настройки. Команда rapira serve принимает только путь к этому файлу. Чтобы использовать четыре воркера, добавьте processes = 4 в существующую таблицу [http.pool].
Относительный http.pool.entrypoint использует каталог файла конфигурации как базовый. Текущий каталог на него не влияет.
Файл также управляет заменой воркеров, тайм-аутами запросов, логированием и pid-файлом супервизора. Сервер не запускается, если файл содержит неизвестный ключ. См. Конфигурацию для всех настроек файла и Командную строку для команды.
Остановка сервера
Нажмите Ctrl-C, чтобы остановить сервер. Терминал отправляет SIGINT мастеру и каждому воркеру, поэтому текущие запросы останавливаются немедленно. Чтобы текущие запросы завершились, отправьте SIGTERM только мастеру, например kill -TERM <master-pid>. Полная таблица сигналов доступна в разделе Модель процессов.
Что дальше
- Режим Worker описывает резидентный цикл, состояние, утечки памяти, замену воркеров и инициализацию приложения.
- Конфигурация перечисляет каждый ключ
rapira.tomlи его значение по умолчанию. - Фреймворки содержит руководства по интеграции для Symfony, Laravel и Yii3.