与其使用本地安装的 PHP 库,还可以通过优秀的 static-php-cli 项目 创建 FrankenPHP 的静态构建(尽管它的名字是这样,但该项目支持所有 SAPIs,不仅仅是 CLI)。

使用这种方法,一个单一的、便携的二进制文件将包含 PHP 解释器、Caddy web 服务器和 FrankenPHP!

FrankenPHP 还支持将 PHP 应用程序嵌入静态二进制文件中。

Linux

我们提供了一个 Docker 镜像来构建 Linux 静态二进制文件:

  1. docker buildx bake --load static-builder
  2. docker cp $(docker create --name static-builder dunglas/frankenphp:static-builder):/go/src/app/dist/frankenphp-linux-$(uname -m) frankenphp ; docker rm static-builder

生成的静态二进制文件命名为 frankenphp,可在当前目录中找到。

如果你想在没有 Docker 的情况下构建静态二进制文件,请查看 macOS 指令,它同样适用于 Linux。

自定义扩展

默认情况下,编译了大多数流行的 PHP 扩展。

为了减小二进制文件的大小并减少攻击面,你可以选择使用 PHP_EXTENSIONS Docker ARG 构建扩展的列表。

例如,运行以下命令仅构建 opcache 扩展:

  1. docker buildx bake --load --set static-builder.args.PHP_EXTENSIONS=opcache,pdo_sqlite static-builder
  2. # ...

要添加启用你所启用扩展的附加功能的库,你可以使用 PHP_EXTENSION_LIBS Docker ARG 传递:

  1. docker buildx bake \
  2. --load \
  3. --set static-builder.args.PHP_EXTENSIONS=gd \
  4. --set static-builder.args.PHP_EXTENSION_LIBS=libjpeg,libwebp \
  5. static-builder

另见如何自定义构建

GitHub Token

如果你遇到了 GitHub API 频率限制,可以在名为 GITHUB_TOKEN 的环境变量中设置 GitHub Personal Access Token:

  1. GITHUB_TOKEN="xxx" docker --load buildx bake static-builder
  2. # ...

macOS

运行以下脚本以创建 macOS 的静态二进制文件(你必须安装了 Homebrew):

  1. git clone https://github.com/dunglas/frankenphp
  2. cd frankenphp
  3. ./build-static.sh

注意:此脚本也适用于 Linux(可能也适用于其他 Unix 系统),并由我们提供的基于 Docker 的静态构建器内部使用。

自定义构建

以下环境变量可以传递给 docker buildbuild-static.sh 脚本,以自定义静态构建:

  • FRANKENPHP_VERSION:要使用的 FrankenPHP 版本
  • PHP_VERSION:要使用的 PHP 版本
  • PHP_EXTENSIONS:要构建的 PHP 扩展(支持的扩展列表在这里
  • PHP_EXTENSION_LIBS:为扩展添加额外功能的库
  • EMBED:要嵌入二进制文件中的 PHP 应用程序的路径
  • CLEAN:当设置时,将从零开始构建 libphp 及其所有依赖项(不使用缓存)
  • NO_COMPRESS:不要使用 UPX 压缩结果二进制文件
  • DEBUG_SYMBOLS:当设置时,不会剥离调试符号,并将它们添加到二进制文件中
  • MIMALLOC:(实验性,仅限 Linux)用 mimalloc 替换 musl 的 mallocng 以提高性能
  • RELEASE:(仅限维护者)当设置时,结果二进制文件将上传至 GitHub