Laravel
Rapira запускает Laravel в режиме Classic со стандартным входным скриптом public/index.php. Каждый HTTP-запрос выполняется в новом запросе PHP, как в php-fpm. Изменения приложения не требуются. Rapira пока не поддерживает Laravel в режиме Worker.
Проверено на
- PHP 8.5.8: NTS, embed SAPI
- Rapira 0.8.0
- Базовое приложение laravel/laravel с laravel/framework v13.23.0
Тесты использовали базовое приложение laravel/laravel в режиме Classic с одним воркером и дополнительными маршрутами. Тесты проверяли маршрутизацию, сессии, загрузку файлов, тела запросов, кеш конфигурации, кеш маршрутов, ошибки и 50 последовательных запросов. Примеры на этой странице используют формат конфигурации v0.9.
Требования
Установите Rapira по инструкции Установка. Rapira предоставляет PHP как библиотеку, а не как команду php. Установите PHP CLI для Composer и artisan. Rapira не использует и не изменяет этот CLI.
Новый проект laravel/laravel использует SQLite и драйверы сессий, кеша и очередей на основе базы данных. Поэтому требуется pdo_sqlite. Релизные сборки Rapira включают pdo_sqlite. Полный список расширений см. в разделе Установка. Если вы собираете PHP, включите расширения, которые нужны вашим драйверам. См. раздел Сборка из исходников.
Другой вариант: задайте SESSION_DRIVER=file, CACHE_STORE=file и QUEUE_CONNECTION=sync. Тесты для этой страницы использовали эти параметры.
Запуск сервера
Режим по умолчанию: dispatcher, но в public/index.php Laravel нет цикла диспетчера. Задайте mode = "classic" в rapira.toml:
[http]
listen = "127.0.0.1:8000"
[http.pool]
entrypoint = "public/index.php"
mode = "classic"
processes = 4Для запуска сервера выполните rapira serve rapira.toml. Относительный entrypoint использует каталог файла конфигурации как базовый. Все ключи и значения по умолчанию см. в разделе Конфигурация.
У приложения нет постоянного состояния, которое нужно сбрасывать между запросами. PHP запускается один раз в мастер-процессе до того, как мастер создаёт воркеры. Поэтому все воркеры используют один общий OPcache для кода приложения и vendor/. В PHP 8.4 OPcache является отдельным opcache.so, которому нужна строка zend_extension в php.ini. Подробнее см. в разделе Режим Classic.
Создайте кеши фреймворка перед запуском в продакшене. Тесты подтвердили оба кеша в режиме Classic:
php artisan config:cache
php artisan route:cacheМаршрутизация и URL
Rapira не сопоставляет URL со скриптами PHP. Каждый запрос запускает public/index.php, и Laravel выполняет маршрутизацию по пути в $_SERVER['REQUEST_URI']. Тесты проверили маршрутизацию, страницу 404 Laravel и генерацию URL через url(). Созданные URL являются абсолютными и не содержат index.php. Им не нужны переопределения $_SERVER и изменения конфигурации маршрутов или URL.
Чтобы отдавать ресурсы из public/, включите middleware статических файлов. Добавьте middleware в существующую таблицу [http] и добавьте таблицу [http.static]. Rapira требует оба параметра:
[http]
middleware = ["static"]
[http.static]
root = "public"Middleware отвечает на запросы, которые соответствуют файлам в public/. Все остальные запросы передаются в Laravel. Вместо этого ресурсы может отдавать CDN или обратный прокси.
Встроенный маршрут /up возвращает 200. Балансировщик нагрузки или контейнер может использовать его для проверок состояния. Rapira также может отдавать /livez и /readyz на отдельном адресе. См. Метрики и проверки работоспособности.
Rapira принимает только открытый HTTP и оставляет $_SERVER['HTTPS'] пустым, также когда запрос содержит X-Forwarded-Proto. Если прокси завершает TLS, настройте в Laravel доверенные прокси. Без этой настройки url() создаёт ссылки http://.
Сессии, CSRF и формы
Тесты использовали файловый драйвер сессий. Каждый клиент получил отдельную сессию и отправил cookie сессии со следующим запросом. CSRF не требует настройки Rapira, потому что токен находится в сессии.
Тесты также проверили данные форм, тела JSON и загрузку файлов. http.max_body_size_mb ограничивает тело запроса до запуска PHP. Значение по умолчанию: 8 МиБ. Для тела большего размера Rapira возвращает 413, и Laravel не получает запрос. Чтобы принимать загрузки большего размера, увеличьте это значение. Также увеличьте post_max_size и upload_max_filesize в php.ini. См. раздел Тела запросов.
При исключении в маршруте Laravel вернул обычный ответ 500. Следующий запрос выполнился обычным образом и не повторил исключение.
Режим Worker
Rapira пока не поддерживает Laravel в режиме Worker. Запускайте Laravel в режиме Classic.
Laravel хранит состояние запроса в контейнере, в уже созданных синглтонах и в статических свойствах. Воркер должен сбросить это состояние до следующего запроса. Octane выполняет этот сброс для поддерживаемых серверов, но у Rapira нет драйвера Octane. Приложения Symfony и Yii3 могут работать в режиме Worker.
Собственный воркер Laravel без полного сброса состояния может передать данные запроса, сессии или аутентификации одного запроса последующему запросу. Не используйте собственный воркер без полных тестов изоляции состояния.