Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.

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

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

Этот документ объясняет, как создать бинарный файл 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.

ФункцияЗависимостьТег сборки для отключения
Сжатие BrotliBrotlinobrotli
Перезапуск worker-скриптов при изменении файловWatcher Cnowatcher

# Компиляция 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\'"'
(измените значение размера стека в зависимости от требований вашего приложения).

Редактировать эту страницу