4.9 KiB
Компиляция из исходников
Этот документ объясняет, как создать бинарный файл FrankenPHP, который будет загружать PHP как динамическую библиотеку.
Это рекомендуемый способ.
Альтернативно можно создать статическую сборку.
Установка PHP
FrankenPHP совместим с PHP версии 8.2 и выше.
Сначала загрузите исходники PHP и распакуйте их:
tar xf php-*
cd php-*/
Далее выполните скрипт configure
с параметрами, необходимыми для вашей платформы.
Следующие флаги ./configure
обязательны, но вы можете добавить и другие, например, для компиляции расширений или дополнительных функций.
Linux
./configure \
--enable-embed \
--enable-zts \
--disable-zend-signals \
--enable-zend-max-execution-timers
Mac
Используйте пакетный менеджер Homebrew для установки
libiconv
, bison
, re2c
и pkg-config
:
brew install libiconv bison brotli re2c pkg-config
echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc
Затем выполните скрипт configure:
./configure \
--enable-embed=static \
--enable-zts \
--disable-zend-signals \
--disable-opcache-jit \
--enable-static \
--enable-shared=no \
--with-iconv=/opt/homebrew/opt/libiconv/
Компиляция PHP
Наконец, скомпилируйте и установите PHP:
make -j"$(getconf _NPROCESSORS_ONLN)"
sudo make install
Установка дополнительных зависимостей
Некоторые функции FrankenPHP зависят от опциональных системных зависимостей.
Альтернативно, эти функции можно отключить, передав соответствующие теги сборки компилятору Go.
Функция | Зависимость | Тег сборки для отключения |
---|---|---|
Сжатие Brotli | Brotli | nobrotli |
Перезапуск worker-скриптов при изменении файлов | Watcher C | nowatcher |
Компиляция Go-приложения
Теперь можно собрать итоговый бинарный файл:
curl -L https://github.com/php/frankenphp/archive/refs/heads/main.tar.gz | tar xz
cd frankenphp-main/caddy/frankenphp
CGO_CFLAGS=$(php-config --includes) CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" go build -tags=nobadger,nomysql,nopgx
Использование xcaddy
Альтернативно, используйте xcaddy для компиляции FrankenPHP с пользовательскими модулями Caddy:
CGO_ENABLED=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS=$(php-config --includes) \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
xcaddy build \
--output frankenphp \
--with github.com/dunglas/frankenphp/caddy \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy
# Добавьте дополнительные модули Caddy здесь
Tip
Если вы используете musl libc (по умолчанию в Alpine Linux) и Symfony,
возможно, потребуется увеличить размер стека.
В противном случае вы можете столкнуться с ошибками вроде
PHP Fatal error: Maximum call stack size of 83360 bytes reached during compilation. Try splitting expression
.Для этого измените значение переменной окружения
XCADDY_GO_BUILD_FLAGS
, например:XCADDY_GO_BUILD_FLAGS=$'-ldflags "-w -s -extldflags \'-Wl,-z,stack-size=0x80000\'"'
(измените значение размера стека в зависимости от требований вашего приложения).