这份文档解释了如何创建一个将 PHP 作为动态库加载的 FrankenPHP 构建。这是推荐的方法。

另外,创建静态构建 也是可能的。

安装 PHP

FrankenPHP 与 PHP 8.2 及更高版本兼容。

首先,获取 PHP 的源代码 并解压它们:

  1. tar xf php-*
  2. cd php-*/

然后,为你的平台配置 PHP:

Linux

  1. ./configure \
  2. --enable-embed \
  3. --enable-zts \
  4. --disable-zend-signals \
  5. --enable-zend-max-execution-timers

最后,编译并安装 PHP:

  1. make -j$(nproc)
  2. sudo make install

Mac

使用 Homebrew 包管理器安装 libiconvbisonre2cpkg-config

  1. brew install libiconv bison re2c pkg-config
  2. echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc

然后运行配置脚本:

  1. ./configure \
  2. --enable-embed=static \
  3. --enable-zts \
  4. --disable-zend-signals \
  5. --disable-opcache-jit \
  6. --enable-static \
  7. --enable-shared=no \
  8. --with-iconv=/opt/homebrew/opt/libiconv/

这些标志是必需的,但如果需要,你可以添加其他标志(例如额外的扩展)。

最后,编译并安装 PHP:

  1. make -j$(sysctl -n hw.logicalcpu)
  2. sudo make install

编译 Go 应用程序

现在你可以使用 Go 库并编译我们的 Caddy 构建:

  1. curl -L https://github.com/dunglas/frankenphp/archive/refs/heads/main.tar.gz | tar x
  2. cd frankenphp-main/caddy/frankenphp
  3. CGO_CFLAGS=$(php-config --includes) CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" go build

使用 xcaddy

或者,使用 xcaddy 编译带有 自定义 Caddy 模块 的 FrankenPHP:

  1. CGO_ENABLED=1 \
  2. XCADDY_GO_BUILD_FLAGS="-ldflags '-w -s'" \
  3. xcaddy build \
  4. --output frankenphp \
  5. --with github.com/dunglas/frankenphp/caddy \
  6. --with github.com/dunglas/mercure/caddy \
  7. --with github.com/dunglas/vulcain/caddy
  8. # 在此处添加额外的 Caddy 模块

提示

如果你使用的是 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\'"'(根据你的应用程序需求更改栈大小的值)。