Skip to content

Режим Classic ​

Режим Classic выполняет обычный входной PHP-скрипт. Это может быть тот же файл public/index.php, который выполняет php-fpm. Rapira создаёт новый запрос PHP для каждого HTTP-запроса. Она заполняет суперглобальные переменные и выполняет скрипт. Вывод скрипта становится ответом. Большинство приложений может перейти с php-fpm на режим Classic без изменений кода.

Новое состояние для каждого запроса ​

Каждый запрос получает полный цикл запроса PHP. Он включает инициализацию запроса, выполнение входного скрипта и завершение запроса. PHP удаляет состояние запроса до начала следующего запроса. К этому состоянию относятся глобальные переменные, статические свойства, DI-контейнер и карта объектов ORM.

Объекты и данные запроса не влияют на следующий запрос. Часть состояния остаётся в процессе воркера: постоянные соединения, состояние расширений и рабочий каталог. Приложения без поддержки постоянных процессов могут работать в режиме Classic.

Приложение инициализирует автозагрузчик, конфигурацию, контейнер и маршруты для каждого запроса. См. Режимы выполнения.

Каждый воркер использует каталог входного скрипта как рабочий каталог. Вызов chdir() в запросе действует и для следующих запросов того же воркера, пока воркер не завершится. Если запрос изменяет рабочий каталог, восстановите его до завершения запроса.

Rapira не предоставляет функцию php-fpm fastcgi_finish_request(). Используйте rapira_finish_request() для отправки ответа до завершения скрипта. Дополнительная информация находится в разделе HTTP.

Выбор режима ​

Выберите режим Classic ключом mode = "classic" в таблице [http.pool] файла rapira.toml. Только HTTP-пул поддерживает режим Classic. Полный список ключей см. в разделе Конфигурация.

Входной скрипт для режима Classic - это обычный PHP:

php
<?php
// index.php
header('Content-Type: text/plain');
echo "Hello, " . ($_GET['name'] ?? 'anonymous') . "!\n";
echo "Method: {$_SERVER['REQUEST_METHOD']}\n";

Файл rapira.toml для этого скрипта:

toml
[http]
listen = "127.0.0.1:8000"

[http.pool]
entrypoint = "public/index.php"
mode = "classic"

Запустите Rapira командой rapira serve rapira.toml. Относительный http.pool.entrypoint использует каталог файла конфигурации как базовый. Команду см. в разделе Командная строка.

Входной скрипт ​

Rapira не сопоставляет URL со скриптами PHP. Каждый запрос запускает настроенный входной скрипт. $_SERVER['REQUEST_URI'] содержит URL для маршрутизации приложения.

Middleware статических файлов может возвращать файлы для запросов GET и HEAD. Входной скрипт обрабатывает запросы, на которые middleware не отвечает. Статические файлы также может отдавать CDN или обратный прокси. Пример обратного прокси см. в разделе Запуск в продакшене.

SCRIPT_FILENAME содержит абсолютный путь входного скрипта. SCRIPT_NAME содержит имя файла с начальным слешем, например /index.php. DOCUMENT_ROOT содержит каталог входного скрипта.

Загрузка файлов ​

PHP разбирает тела multipart/form-data и заполняет $_FILES, как в php-fpm. Настройки upload_max_filesize и post_max_size в php.ini действуют.

Rapira применяет http.max_body_size_mb ко всему телу запроса до запуска PHP. Значение по умолчанию - 8 МиБ. Для тела большего размера Rapira возвращает 413. Если php.ini разрешает загрузки большего размера, увеличьте http.max_body_size_mb до значения post_max_size. Дополнительная информация находится в разделе Тела запросов.

Таблица [http.uploads] действует только в режиме Dispatcher. Rapira не запускается, если конфигурация режима Classic содержит эту таблицу. Дополнительная информация находится в разделе Конфигурация.

OPcache ​

Каждый запрос PHP удаляет состояние приложения. OPcache сохраняет скомпилированный байт-код между запросами. Мастер-процесс запускает PHP до создания воркеров, поэтому все воркеры используют один сегмент общей памяти OPcache. После включения OPcache следующие запросы используют кешированный байт-код, и PHP не компилирует неизменённые скрипты повторно. Настройка OPcache описана в разделе Запуск в продакшене.

Каждый воркер обрабатывает один запрос за раз. http.pool.processes задаёт количество воркеров. Это значение также задаёт максимальное число параллельных запросов. См. Модель процессов.

Выбор между режимами Classic и Worker ​

Используйте режим Classic, если приложение не может безопасно сохранять состояние между запросами. Например, некоторые приложения и библиотеки вендоров хранят данные запроса в статических свойствах. Режим Classic также уменьшает изменения приложения при переходе с php-fpm. Используйте режим Worker, если приложение поддерживает постоянный процесс. Режим Worker удаляет инициализацию приложения из каждого запроса. Все три режима описаны в разделе Режимы выполнения.

В режиме Classic Rapira\handle_request() бросает Rapira\Exception\NotInWorkerModeError. Скрипт режима Classic завершается вместе со своим запросом и не может выполнять цикл запросов.