compile.md 4.8 KB

Компиляция из исходников

Этот документ объясняет, как создать бинарный файл 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/dunglas/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\'"'
(измените значение размера стека в зависимости от требований вашего приложения).