Этот документ объясняет, как создать бинарный файл FrankenPHP, который будет загружать PHP как динамическую библиотеку.
Это рекомендуемый способ.
Альтернативно можно создать статическую сборку.
FrankenPHP совместим с PHP версии 8.2 и выше.
Сначала загрузите исходники PHP и распакуйте их:
tar xf php-*
cd php-*/Далее выполните скрипт configure с параметрами, необходимыми для вашей платформы.
Следующие флаги ./configure обязательны, но вы можете добавить и другие, например, для компиляции расширений или дополнительных функций.
./configure \
--enable-embed \
--enable-zts \
--disable-zend-signals \
--enable-zend-max-execution-timersИспользуйте пакетный менеджер 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:
make -j"$(getconf _NPROCESSORS_ONLN)"
sudo make installНекоторые функции FrankenPHP зависят от опциональных системных зависимостей.
Альтернативно, эти функции можно отключить, передав соответствующие теги сборки компилятору Go.
| Функция | Зависимость | Тег сборки для отключения |
|---|---|---|
| Сжатие Brotli | Brotli | nobrotli |
| Перезапуск worker-скриптов при изменении файлов | Watcher C | nowatcher |
Теперь можно собрать итоговый бинарный файл:
curl -L https://github.com/dunglas/frankenphp/archive/refs/heads/main.tar.gz | tar xz
cd frankenphp-main
./install_dependencies.sh
cd caddy/frankenphp
CGO_CFLAGS="$(php-config --includes) -I$PWD/../../dist/dependencies/include" \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs) -L$PWD/../../dist/dependencies/lib" \
go build -tags=nobadger,nomysql,nopgxОбратите внимание, что это создаст бинарный файл frankenphp без Mercure и Vulcain. Для производственного использования лучше использовать xcaddy.
Альтернативно, используйте xcaddy для компиляции FrankenPHP с пользовательскими модулями Caddy:
CGO_ENABLED=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS="$(php-config --includes) -I$PWD/../../dist/dependencies/include" \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs) -L$PWD/../../dist/dependencies/lib" \
xcaddy build \
--output frankenphp \
--with github.com/dunglas/frankenphp/caddy \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy \
--with github.com/dunglas/caddy-cbrotli
# Добавьте дополнительные модули 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\'"'
(измените значение размера стека в зависимости от требований вашего приложения).
Для получения дополнительной информации ознакомьтесь с файлом build-static.sh.