FrankenPHP 能够将 PHP 应用程序的源代码和资源嵌入到一个静态的、自包含的二进制文件中。

得益于这个特性,PHP 应用程序可以作为独立的二进制文件分发,其中包含了应用程序本身、PHP 解释器和 Caddy —— 一个生产级别的 web 服务器。

了解更多关于这个特性的信息,请查看 Kévin 在 SymfonyCon 2023 上的 演讲

对于嵌入 Laravel 应用程序,阅读这篇特定的文档条目

准备您的应用程序

在创建自包含的二进制文件之前,请确保您的应用程序已准备好嵌入。

例如,您可能想要:

  • 安装应用程序的生产依赖
  • 导出自动加载器
  • 启用应用程序的生产模式(如果有)
  • 删除不需要的文件,如 .git 或测试文件,以减小最终二进制文件的大小

例如,对于 Symfony 应用程序,您可以使用以下命令:

  1. # 导出项目以摆脱 .git/ 等
  2. mkdir $TMPDIR/my-prepared-app
  3. git archive HEAD | tar -x -C $TMPDIR/my-prepared-app
  4. cd $TMPDIR/my-prepared-app
  5. # 设置适当的环境变量
  6. echo APP_ENV=prod > .env.local
  7. echo APP_DEBUG=0 >> .env.local
  8. # 删除测试和其他不必要的文件以节省空间
  9. # 或者,在 .gitattributes 文件中添加这些文件的 export-ignore 属性
  10. rm -Rf tests/
  11. # 安装依赖
  12. composer install --ignore-platform-reqs --no-dev -a
  13. # 优化 .env
  14. composer dump-env prod

创建 Linux 二进制文件

创建 Linux 二进制文件的最简单方法是使用我们提供的基于 Docker 的构建器。

  1. 在应用程序的仓库中创建一个名为 static-build.Dockerfile 的文件:

    1. FROM --platform=linux/amd64 dunglas/frankenphp:static-builder
    2. # 复制您的应用程序
    3. WORKDIR /go/src/app/dist/app
    4. COPY . .
    5. # 构建静态二进制文件
    6. WORKDIR /go/src/app/
    7. RUN EMBED=dist/app/ ./build-static.sh

    注意

    一些 .dockerignore 文件(例如,默认的 Symfony Docker .dockerignore)会忽略 vendor/ 目录和 .env 文件。在构建之前,请确保调整或删除 .dockerignore 文件。

  2. 构建:

    1. docker build -t static-app -f static-build.Dockerfile .
  3. 提取二进制文件:

    1. docker cp $(docker create --name static-app-tmp static-app):/go/src/app/dist/frankenphp-linux-x86_64 my-app ; docker rm static-app-tmp

生成的二进制文件是当前目录中名为 my-app 的文件。

为其他操作系统创建二进制文件

如果您不想使用 Docker,或者想要构建 macOS 二进制文件,请使用我们提供的 shell 脚本:

  1. git clone https://github.com/dunglas/frankenphp
  2. cd frankenphp
  3. EMBED=/path/to/your/app ./build-static.sh

生成的二进制文件是 dist/ 目录中名为 frankenphp-<os>-<arch> 的文件。

使用二进制文件

就是这样!my-app 文件(或在其他操作系统上的 dist/frankenphp-<os>-<arch>)包含了您的自包含应用程序!

要启动 web 应用程序,请运行:

  1. ./my-app php-server

如果您的应用程序包含 工作脚本,请使用类似以下命令启动工作进程:

  1. ./my-app php-server --worker public/index.php

要启用 HTTPS(自动创建 Let’s Encrypt 证书)、HTTP/2 和 HTTP/3,请指定要使用的域名:

  1. ./my-app php-server --domain localhost

您还可以运行嵌入在您的二进制文件中的 PHP CLI 脚本:

  1. ./my-app php-cli bin/console

PHP 扩展

默认情况下,脚本会根据您项目的 composer.json 文件构建所需的扩展(如果有)。如果不存在 composer.json 文件,则会构建默认扩展,如 静态构建条目 中所记录。

要自定义扩展,使用 PHP_EXTENSIONS 环境变量。

自定义构建

阅读静态构建文档 以了解如何自定义二进制文件(扩展、PHP 版本等)。

分发二进制文件

在 Linux 上,创建的二进制文件使用 UPX 压缩。

在 Mac 上,为了在发送之前减小文件大小,您可以压缩它。我们推荐使用 xz