FrankenPHP 能够将 PHP 应用程序的源代码和资源嵌入到一个静态的、自包含的二进制文件中。
得益于这个特性,PHP 应用程序可以作为独立的二进制文件分发,其中包含了应用程序本身、PHP 解释器和 Caddy —— 一个生产级别的 web 服务器。
了解更多关于这个特性的信息,请查看 Kévin 在 SymfonyCon 2023 上的 演讲。
对于嵌入 Laravel 应用程序,阅读这篇特定的文档条目。
准备您的应用程序
在创建自包含的二进制文件之前,请确保您的应用程序已准备好嵌入。
例如,您可能想要:
- 安装应用程序的生产依赖
- 导出自动加载器
- 启用应用程序的生产模式(如果有)
- 删除不需要的文件,如
.git
或测试文件,以减小最终二进制文件的大小
例如,对于 Symfony 应用程序,您可以使用以下命令:
# 导出项目以摆脱 .git/ 等
mkdir $TMPDIR/my-prepared-app
git archive HEAD | tar -x -C $TMPDIR/my-prepared-app
cd $TMPDIR/my-prepared-app
# 设置适当的环境变量
echo APP_ENV=prod > .env.local
echo APP_DEBUG=0 >> .env.local
# 删除测试和其他不必要的文件以节省空间
# 或者,在 .gitattributes 文件中添加这些文件的 export-ignore 属性
rm -Rf tests/
# 安装依赖
composer install --ignore-platform-reqs --no-dev -a
# 优化 .env
composer dump-env prod
创建 Linux 二进制文件
创建 Linux 二进制文件的最简单方法是使用我们提供的基于 Docker 的构建器。
在应用程序的仓库中创建一个名为
static-build.Dockerfile
的文件:FROM --platform=linux/amd64 dunglas/frankenphp:static-builder
# 复制您的应用程序
WORKDIR /go/src/app/dist/app
COPY . .
# 构建静态二进制文件
WORKDIR /go/src/app/
RUN EMBED=dist/app/ ./build-static.sh
注意
一些
.dockerignore
文件(例如,默认的 Symfony Docker.dockerignore
)会忽略vendor/
目录和.env
文件。在构建之前,请确保调整或删除.dockerignore
文件。构建:
docker build -t static-app -f static-build.Dockerfile .
提取二进制文件:
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 脚本:
git clone https://github.com/dunglas/frankenphp
cd frankenphp
EMBED=/path/to/your/app ./build-static.sh
生成的二进制文件是 dist/
目录中名为 frankenphp-<os>-<arch>
的文件。
使用二进制文件
就是这样!my-app
文件(或在其他操作系统上的 dist/frankenphp-<os>-<arch>
)包含了您的自包含应用程序!
要启动 web 应用程序,请运行:
./my-app php-server
如果您的应用程序包含 工作脚本,请使用类似以下命令启动工作进程:
./my-app php-server --worker public/index.php
要启用 HTTPS(自动创建 Let’s Encrypt 证书)、HTTP/2 和 HTTP/3,请指定要使用的域名:
./my-app php-server --domain localhost
您还可以运行嵌入在您的二进制文件中的 PHP CLI 脚本:
./my-app php-cli bin/console
PHP 扩展
默认情况下,脚本会根据您项目的 composer.json
文件构建所需的扩展(如果有)。如果不存在 composer.json
文件,则会构建默认扩展,如 静态构建条目 中所记录。
要自定义扩展,使用 PHP_EXTENSIONS
环境变量。
自定义构建
阅读静态构建文档 以了解如何自定义二进制文件(扩展、PHP 版本等)。
分发二进制文件
在 Linux 上,创建的二进制文件使用 UPX 压缩。
在 Mac 上,为了在发送之前减小文件大小,您可以压缩它。我们推荐使用 xz
。