# 创建静态构建 基于 [static-php-cli](https://github.com/crazywhalecc/static-php-cli) 项目(这个项目支持所有 SAPI,不仅仅是 `cli`), FrankenPHP 已支持创建静态二进制,无需安装本地 PHP。 使用这种方法,我们可构建一个包含 PHP 解释器、Caddy Web 服务器和 FrankenPHP 的可移植二进制文件! FrankenPHP 还支持 [将 PHP 应用程序嵌入到静态二进制文件中](embed.md)。 ## Linux 我们提供了一个 Docker 镜像来构建 Linux 静态二进制文件: ```console docker buildx bake --load static-builder 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 参数来自定义构建的扩展。 例如,运行以下命令以生成仅包含 `opcache,pdo_sqlite` 扩展的二进制: ```console docker buildx bake --load --set static-builder.args.PHP_EXTENSIONS=opcache,pdo_sqlite static-builder # ... ``` 若要将启用其他功能的库添加到已启用的扩展中,可以使用 `PHP_EXTENSION_LIBS` Docker 参数: ```console docker buildx bake \ --load \ --set static-builder.args.PHP_EXTENSIONS=gd \ --set static-builder.args.PHP_EXTENSION_LIBS=libjpeg,libwebp \ static-builder ``` 参见:[自定义构建](#自定义构建) ### GitHub Token 如果遇到了 GitHub API 速率限制,请在 `GITHUB_TOKEN` 的环境变量中设置 GitHub Personal Access Token: ```console GITHUB_TOKEN="xxx" docker --load buildx bake static-builder # ... ``` ## macOS 运行以下脚本以创建适用于 macOS 的静态二进制文件(需要先安装 [Homebrew](https://brew.sh/)): ```console git clone https://github.com/dunglas/frankenphp cd frankenphp ./build-static.sh ``` 注意:此脚本也适用于 Linux(可能也适用于其他 Unix 系统),我们提供的用于构建静态二进制的 Docker 镜像也在内部使用这个脚本。 ## 自定义构建 以下环境变量可以传递给 `docker build` 和 `build-static.sh` 脚本来自定义静态构建: * `FRANKENPHP_VERSION`: 要使用的 FrankenPHP 版本 * `PHP_VERSION`: 要使用的 PHP 版本 * `PHP_EXTENSIONS`: 要构建的 PHP 扩展([支持的扩展列表](https://static-php.dev/zh/guide/extensions.html)) * `PHP_EXTENSION_LIBS`: 要构建的额外库,为扩展添加额外的功能 * `EMBED`: 要嵌入二进制文件的 PHP 应用程序的路径 * `CLEAN`: 设置后,libphp 及其所有依赖项都是重新构建的(不使用缓存) * `DEBUG_SYMBOLS`: 设置后,调试符号将被保留在二进制文件内 * `RELEASE`: (仅限维护者)设置后,生成的二进制文件将上传到 GitHub 上