Установка
Rapira поставляется бинарником rapira и библиотекой libphp рядом с ним — это и есть интерпретатор PHP, который сервер загружает в свой процесс. Больше в артефакте ничего нет: ни команды php, ни php-fpm, ни каталога с ini. Устанавливать PHP на машину, чтобы Rapira заработала, не нужно.
Что такое libphp и почему это не «просто PHP»?
Из одних и тех же исходников PHP собирается несколько интерфейсов к движку — их называют SAPI. Движок при этом один и тот же, Zend с расширениями; отличается только обёртка вокруг него и то, кто управляет ходом программы:
| SAPI | Что получается | Кто управляет |
|---|---|---|
| CLI | команда php | PHP: запустился, выполнил скрипт, завершился. |
| FPM | php-fpm | PHP: сам слушает сокет и держит пул воркеров. |
| embed | libphp.so | Программа-хост: вызывает интерпретатор как обычную библиотеку. |
Rapira кладёт рядом с собой embed-сборку, потому что ходом запроса управляет сервер, а не PHP. Команда php — это другой SAPI и другая задача, поэтому в артефакте её нет.
Почему libphp не берётся из системы?
Нужен PHP, собранный с --enable-embed=shared: только такая сборка даёт libphp.so. Дистрибутивы её почти не предлагают, а там, где она есть — php-embedded в Fedora и RHEL, php-embed в Arch, libphpX.Y-embed из deb.sury.org в Debian и Ubuntu, — минорную версию и набор расширений приходится принимать такими, какие есть; в php из Homebrew embed SAPI нет вообще. Поэтому каждый релиз Rapira собирает libphp из официального архива с исходниками PHP и кладёт её рядом с бинарником.
Что значит «PHP работает внутри процесса Rapira»?
При старте libphp загружается в адресное пространство процесса rapira, и дальше обращение к PHP — это вызов функции в той же памяти: ни сокета, ни FastCGI, ни сериализации запроса и ответа. Речь именно про выполнение кода: файлом библиотека остаётся отдельным и лежит рядом с бинарником, поэтому унести бинарник из каталога без неё нельзя (см. Архивы для Linux и macOS).
Выбор версии PHP
В имени каждого файла для скачивания стоит php8.4 или php8.5 — это версия PHP, из исходников которой собрана лежащая в артефакте libphp. Выберите ту минорную версию, на которой работает приложение, и берите 8.5, если что-то в вашем стеке не требует 8.4.
Уже установленный на машине PHP — системный php, пул php-fpm, сборка из Homebrew — Rapira не использует и не трогает. Команды php нет ни в одном артефакте, поэтому Composer, bin/console и artisan по-прежнему работают через ваш PHP CLI.
Почему под каждую версию PHP своя сборка Rapira?
libphp в артефакте — не заменяемая зависимость, а часть сборки: бинарник rapira слинкован с конкретной библиотекой, а её ABI меняется от одной минорной версии PHP к другой. Поэтому одна сборка Rapira работает ровно с одной веткой PHP, и версия вынесена в имя файла. Взамен нет ни шага «сначала поставьте PHP», ни php-config, на который нужно указать, ни версии, которую нужно держать в синхронизации.
Как переключиться с 8.4 на 8.5?
Поставьте пакет с другой версией — менеджер пакетов сделает замену сам. rapira-php8.4 и rapira-php8.5 занимают ровно одни и те же пути, поэтому оба объявляют provides, conflicts и replaces (в rpm — obsoletes) на виртуальный пакет rapira: рядом они не встают, второй заменяет первый. Архивы друг друга не исключают: каждый распаковывается в свой каталог, поэтому дерево 8.4 и дерево 8.5 могут лежать рядом и запускаться из разных путей.
Артефакты релиза
Все файлы лежат на странице релизов на GitHub. Страница загрузки сама подберёт артефакт под вашу платформу — ОС, архитектуру, версию PHP, формат пакета — и покажет его SHA-256; у каждого артефакта с php8.5 есть такой же с php8.4.
На Linux берите пакет, если хотите, чтобы файлы легли туда, где их ждёт дистрибутив, а apt или dnf подтянули разделяемые библиотеки, которые нужны PHP; берите архив, если сервер должен целиком уместиться в одном самодостаточном каталоге — образ контейнера, артефакт деплоя, машина, где у вас нет root.
И то и другое сверьте с rapira-v0.6.0-SHA256SUMS.txt до установки — команды приведены в разделе Проверка контрольных сумм.
Зачем сверять контрольную сумму до установки?
.deb и .rpm выполняют свои установочные скрипты от root, то есть подменённый файл получает права root ещё до того, как вы запустите сервер. Проверка занимает одну команду и снимает этот риск.
Debian и Ubuntu
Скачайте .deb и установите его через apt, указав путь:
curl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-php8.5_0.6.0-1_amd64.deb
sudo apt install ./rapira-php8.5_0.6.0-1_amd64.deb
rapira --versionПакет ставит только сам сервер: ни юнита службы, ни файла конфигурации, ни каталога с ini он не добавляет. Запуск Rapira под systemd — отдельный шаг, он описан на странице Запуск в продакшене.
Пакеты собраны под glibc 2.34, поэтому самые старые системы, куда они встанут, — это Debian 12 и Ubuntu 22.04. Всё, что новее, работает.
Зачем ./ перед именем файла?
Именно ./ в начале объясняет apt, что это локальный файл, а не имя пакета, которое надо искать в репозиториях.
Какие файлы появятся в системе?
Четыре: бинарник /usr/bin/rapira, интерпретатор /usr/lib/rapira/libphp.so, а также лицензия и README в /usr/share/doc/rapira/. Больше пакет ничего не меняет.
RHEL, Rocky и Fedora
То же самое, только через dnf:
curl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-php8.5-0.6.0-1.x86_64.rpm
sudo dnf install ./rapira-php8.5-0.6.0-1.x86_64.rpm
rapira --versionТа же нижняя граница по glibc 2.34 задаёт минимум: RHEL 9 и его пересборки — Rocky 9, AlmaLinux 9, — плюс любая актуальная Fedora.
Архивы для Linux и macOS
Архив распаковывается в один каталог, где лежит весь сервер целиком:
rapira-v0.6.0-php8.5-linux-x86_64/
├── bin/rapira
├── lib/rapira/libphp.so
├── share/php/PHP_VERSION.txt
├── README.md
└── LICENSEПеренесите каталог туда, где он будет лежать постоянно, и добавьте бинарник в PATH через симлинк:
curl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-v0.6.0-php8.5-linux-x86_64.tar.gz
tar xzf rapira-v0.6.0-php8.5-linux-x86_64.tar.gz
sudo mv rapira-v0.6.0-php8.5-linux-x86_64 /opt/rapira
sudo ln -s /opt/rapira/bin/rapira /usr/local/bin/rapira
rapira --versioncurl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-v0.6.0-php8.5-macos-aarch64.tar.gz
tar xzf rapira-v0.6.0-php8.5-macos-aarch64.tar.gz
sudo mv rapira-v0.6.0-php8.5-macos-aarch64 /opt/rapira
sudo ln -s /opt/rapira/bin/rapira /usr/local/bin/rapira
rapira --versionБинарник ищет свой интерпретатор рядом с собой, поэтому переносить каталог можно только целиком: cp bin/rapira /usr/local/bin/ ломает запуск. В PATH добавляйте симлинк, как в командах выше.
Почему симлинк работает, а копия бинарника — нет?
Путь к интерпретатору зашит в бинарник как относительный rpath — $ORIGIN/../lib/rapira на Linux и @loader_path/../lib/rapira на macOS, — а точкой отсчёта служит реальное расположение самого бинарника. Рядом с /usr/local/bin никакого lib/rapira нет, поэтому копия интерпретатор не находит. Симлинк загрузчик сначала разрешает и только потом раскрывает rpath, так что ссылка может лежать где угодно, а настоящее дерево остаётся целым.
Какие системные библиотеки нужны для архива?
На macOS в lib/rapira лежит libphp.dylib вместе со всеми несистемными библиотеками, от которых он зависит, — дерево получается самодостаточным. На Linux в комплект входит только libphp.so, а привычные системные библиотеки — OpenSSL 3, libcurl, libxml2, SQLite, Oniguruma, zlib — должны быть в системе. В обычном дистрибутиве они там и так есть; именно их deb и rpm объявляют своими зависимостями вместе с glibc и libgcc.
Проверка контрольных сумм
В каждом релизе есть один файл с контрольными суммами сразу для всех его файлов, поэтому при проверке нужно выбрать только те, которые вы скачали. На Linux это делает флаг --ignore-missing, а на macOS grep передаёт shasum ровно одну нужную строку:
curl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-v0.6.0-SHA256SUMS.txt
sha256sum -c --ignore-missing rapira-v0.6.0-SHA256SUMS.txtcurl -LO https://github.com/rapira-rs/rapira/releases/download/v0.6.0/rapira-v0.6.0-SHA256SUMS.txt
grep rapira-v0.6.0-php8.5-macos-aarch64.tar.gz rapira-v0.6.0-SHA256SUMS.txt | shasum -a 256 -cСборка libphp
libphp собрана с --disable-all, после чего обратно включён фиксированный набор расширений:
- Основа рантайма — session, filter, mbstring, iconv, ctype, tokenizer, fileinfo, phar.
- OPcache и PCRE с включённым JIT.
- Сеть и сжатие — openssl, curl, zlib.
- XML — libxml, dom, xml, simplexml, xmlreader, xmlwriter.
- Базы данных — PDO с
pdo_sqliteи самsqlite3. - Всё, что PHP собирает в себя всегда, — Core, standard, SPL, date, json, hash, random, Reflection.
Чего в ней нет: pdo_mysql, pgsql, redis, apcu, imagick и всего остального из этого ряда. Если вашему приложению нужно такое расширение, соберите libphp с ним и скомпилируйте Rapira под него — как, описано на странице Сборка из исходников.
Каждый релиз берёт самую свежую патч-версию той ветки, которую собирает. В архиве точная версия записана в share/php/PHP_VERSION.txt, а на работающем сервере её сообщают PHP_VERSION и phpinfo().
Почему PHP_SAPI возвращает fastcgi на PHP 8.4?
На PHP 8.4 OPcache запускается только для фиксированного списка имён SAPI, а имя не из списка означает, что общего кеша опкодов не будет вовсе, — поэтому там SAPI регистрируется под именем fastcgi. В PHP 8.5 список убрали, и PHP_SAPI с php_sapi_name() возвращают rapira. Строка Server API в phpinfo() в обоих случаях показывает Rapira. Код, который ветвится по PHP_SAPI, должен понимать оба значения.
php.ini
Ни в пакетах, ни в архивах нет php.ini, и Rapira его не создаёт, поэтому нетронутая установка работает на встроенных умолчаниях PHP. Укажите через PHPRC настоящий файл или каталог, в котором его искать:
PHPRC=/etc/rapira/php.ini rapira serve --config /etc/rapira/rapira.tomlГде PHP ищет php.ini сам?
Своим обычным способом: сначала смотрит на PHPRC, затем в текущий рабочий каталог и напоследок — в путь, вшитый в сборку, который ведёт внутрь каталога, где PHP собирали, и потому на вашей машине никуда не приводит.
Почему файл называется php.ini, а не php-rapira.ini?
PHP сначала ищет php-<sapi-name>.ini и только потом обычный php.ini, а имя SAPI зависит от версии — fastcgi на 8.4 и rapira на 8.5. Обычный php.ini подходит обеим.
Распространение
Сборки публикуются в GitHub Releases и больше нигде. Репозитория для apt или yum пока нет, поэтому обновление — это скачать новый артефакт и поставить его поверх старого, а не выполнить apt upgrade. Пакет заменяет установленный на месте; с архивом распакуйте новый каталог рядом со старым и переключите симлинк — прежнее дерево останется на месте, и откат будет в одну команду.
Сборка для macOS существует только для Apple Silicon, рассчитана на macOS 14 и новее и подписана ad-hoc: ни Developer ID, ни нотаризации, так что при первом запуске macOS может попросить подтверждение. Сборки под Intel нет. Сборки для Windows публикуются отдельно, в rapira-rs/rapira-windows, и предназначены только для локальной разработки — в продакшене Rapira работает на Linux или macOS.
Быстрый старт описывает, как обработать первый запрос, когда бинарник уже на месте.