Skip to content

Установка

Rapira поставляется бинарником rapira и библиотекой libphp рядом с ним — это и есть интерпретатор PHP, который сервер загружает в свой процесс. Больше в артефакте ничего нет: ни команды php, ни php-fpm, ни каталога с ini. Устанавливать PHP на машину, чтобы Rapira заработала, не нужно.

Что такое libphp и почему это не «просто PHP»?

Из одних и тех же исходников PHP собирается несколько интерфейсов к движку — их называют SAPI. Движок при этом один и тот же, Zend с расширениями; отличается только обёртка вокруг него и то, кто управляет ходом программы:

SAPIЧто получаетсяКто управляет
CLIкоманда phpPHP: запустился, выполнил скрипт, завершился.
FPMphp-fpmPHP: сам слушает сокет и держит пул воркеров.
embedlibphp.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, указав путь:

bash
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:

bash
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

Архив распаковывается в один каталог, где лежит весь сервер целиком:

text
rapira-v0.6.0-php8.5-linux-x86_64/
├── bin/rapira
├── lib/rapira/libphp.so
├── share/php/PHP_VERSION.txt
├── README.md
└── LICENSE

Перенесите каталог туда, где он будет лежать постоянно, и добавьте бинарник в PATH через симлинк:

bash
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 --version
bash
curl -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 ровно одну нужную строку:

bash
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.txt
bash
curl -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 настоящий файл или каталог, в котором его искать:

bash
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.

Быстрый старт описывает, как обработать первый запрос, когда бинарник уже на месте.