FrankenPHP 应用嵌入指南:将 PHP 应用打包为独立二进制文件

FrankenPHP 应用嵌入指南:将 PHP 应用打包为独立二进制文件 FrankenPHP 应用嵌入指南将 PHP 应用打包为独立二进制文件【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp本篇指南讲解 FrankenPHP 的核心特性——应用嵌入Embed把 PHP 应用程序的源码、资源文件连同 PHP 解释器与生产级 Web 服务器 Caddy 一起打包成一个静态、独立的可执行文件。读完本文你将掌握从准备应用到构建 Linux/macOS 二进制再到分发与运行的完整流程并理解嵌入机制在源码层面的工作原理可直接将 Symfony、Laravel 等 PHP 应用交付为免安装、免依赖的单文件程序。什么是应用嵌入FrankenPHP 不仅是一个现代的 PHP 应用服务器它还能将整个 PHP 应用打包进一个可执行文件中。得益于 Go 语言的标准embed能力见 embed.go应用的app.tar与校验文件app_checksum.txt会以//go:embed指令编译进二进制程序启动时在init()阶段自动解包到临时目录或指定路径随后由内嵌的 Caddy 直接以该目录为站点根目录提供服务。这意味着最终分发的单个二进制文件包含PHP 应用程序本身源码、Composer 依赖、静态资源PHP 解释器ZTS 线程安全版本静态编译进二进制生产级 Web 服务器 Caddy及其 FrankenPHP 模块。从源码结构看embed.go 中定义了EmbeddedAppPath变量默认解包路径为os.TempDir() /frankenphp_ checksum带校验和的后缀保证应用更新后使用全新目录避免旧缓存污染也可以通过-ldflags -X github.com/dunglas/frankenphp.EmbeddedAppPath/app在构建时固定解包路径适用于应用内含引用绝对路径的预编译产物如 OPcache 文件缓存的场景。准备你的应用在创建独立二进制文件之前请确保应用已准备好进行打包给应用安装生产环境的依赖导出 autoloader如果可能为应用启用生产模式丢弃不需要的文件例如.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_ENVprod .env.local echo APP_DEBUG0 .env.local # 删除测试和其他不需要的文件以节省空间 # 或者将这些文件添加到您的 .gitattributes 文件中并设置 export-ignore 属性 rm -Rf tests/ # 安装依赖项 composer install --ignore-platform-reqs --no-dev -a # 优化 .env composer dump-env prod使用git archive而不是直接复制目录可以确保只导出 Git 仓库中受版本控制的文件配合.gitattributes的export-ignore规则还能进一步排除测试、CI 配置等避免把.git/等无用内容带进最终二进制。自定义配置要自定义 FrankenPHP 配置可以在应用程序的主目录即上例中的$TMPDIR/my-prepared-app放置两个文件CaddyfileCaddy 服务器配置文件用于自定义路由、HTTPS、压缩等行为参见 配置文档php.iniPHP 运行时配置。嵌入后这两个文件会被自动识别并生效在 caddy/php-server.go 中可以看到php-server命令启动时若检测到嵌入目录存在php.ini会将其路径追加到PHP_INI_SCAN_DIR环境变量若检测到Caddyfile则直接加载该配置启动服务器。创建 Linux 二进制文件创建 Linux 二进制文件的最简单方法是使用官方提供的基于 Docker 的构建器。1. 在准备好的应用的存储库中创建一个名为static-build.Dockerfile的文件FROM --platformlinux/amd64 dunglas/frankenphp:static-builder-gnu # 如果你打算在 glibc 系统上运行该二进制文件请使用 static-builder-gnu # 复制应用代码 WORKDIR /go/src/app/dist/app COPY . . # 构建静态二进制文件 WORKDIR /go/src/app/ RUN EMBEDdist/app/ ./build-static.sh[!CAUTION]某些.dockerignore文件例如默认的 Symfony Docker.dockerignore会忽略vendor/文件夹和.env文件。在构建之前请务必调整或删除.dockerignore文件。2. 构建docker build -t static-app -f static-build.Dockerfile .3. 提取二进制文件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的文件。构建器镜像内部的构建逻辑由仓库根目录的 build-static.sh 脚本实现它基于 static-php-cli 项目编译 ZTS 版 PHP调用 xcaddy 组装 Caddy 与 FrankenPHP 模块最后通过--with-frankenphp-app${EMBED}把应用目录打进最终二进制。static-builder-gnu.Dockerfile 使用 CentOS 7 GNU 工具链glibc生成主要静态的二进制可兼容 glibc 2.17 及以上的 Linux 发行版并支持动态加载 PHP 扩展static-builder-musl.Dockerfile 则基于 Alpine musl生成完全静态、零依赖的二进制。为其他操作系统创建二进制文件如果你不想使用 Docker或者想要构建 macOS 二进制文件可以直接使用仓库提供的 shell 脚本git clone https://github.com/php/frankenphp cd frankenphp EMBED/path/to/your/app ./build-static.sh在dist/目录中生成的二进制文件名为frankenphp-os-arch例如 macOS 上为frankenphp-mac-arm64Linux 上为frankenphp-linux-x86_64。从 build-static.sh 的源码可以看到脚本通过uname自动探测操作系统与 CPU 架构来命名产物。使用二进制文件构建完成后my-app文件或其他操作系统上的dist/frankenphp-os-arch就是一个完整的独立应用。启动 Web 应用./my-app php-server如果你的应用包含 worker 脚本用于常驻内存、高性能模式请使用如下命令启动 worker./my-app php-server --worker public/index.php要启用 HTTPS自动创建 Lets Encrypt 证书、HTTP/2 和 HTTP/3请指定要使用的域名./my-app php-server --domain localhost你还可以运行二进制文件中嵌入的 PHP CLI 脚本例如执行 Symfony 的bin/console./my-app php-cli bin/consolephp-cli子命令在识别到嵌入应用时会自动把脚本路径解析为嵌入目录下的文件见 caddy/php-cli.go 对参数路径的拼接逻辑而php-server子命令在嵌入模式下会先把工作目录切换到嵌入应用目录见 caddy/php-server.go保证相对路径、worker 脚本与php.ini均能正确解析。php-server还支持--root、--listen、--watch、--access-log、--no-compress、--mercure等子命令选项完整列表见 caddy/php-server.go。PHP 扩展的处理默认情况下构建脚本会构建你的项目composer.json文件中所要求的扩展如果有的话。这一逻辑在 build-static.sh 中实现当设置了EMBED且应用目录中存在composer.json、composer.lock和vendor/composer/installed.json时脚本调用 static-php-cli 的dump-extensions命令从 Composer 依赖中自动分析出所需的 PHP 扩展集合。如果composer.json文件不存在将构建默认扩展集amqp,apcu,ast,bcmath,brotli,...等 60 余个常用扩展详见 build-static.sh 中的defaultExtensions变量与 静态构建文档 中描述的一致。要自定义扩展请使用PHP_EXTENSIONS环境变量EMBEDdist/app/ PHP_EXTENSIONSopcache,pdo_sqlite ./build-static.sh自定义构建静态构建文档 详细说明了如何自定义二进制文件扩展、PHP 版本等。构建脚本支持的环境变量包括PHP_VERSION要使用的 PHP 版本默认为当前最新稳定版见 build-static.sh 的版本探测逻辑PHP_EXTENSIONS要构建的 PHP 扩展列表PHP_EXTENSION_LIBS为扩展提供额外功能的库如libjpeg、libwebpBrotli 库会被强制包含见 build-static.shFRANKENPHP_VERSION要使用的 FrankenPHP 版本XCADDY_ARGS传给 xcaddy 的参数用于添加额外 Caddy 模块默认包含 cbrotli、Mercure、Vulcain 模块CLEAN设置后强制重新构建 libphp 及其全部依赖不使用缓存MIMALLOC实验性在 musl 目标上以 mimalloc 替换默认内存分配器以提升高并发性能DEBUG_SYMBOLS设置后保留二进制内的调试符号同时禁用 strip 与 UPX 压缩。这些变量同时适用于docker build与直接运行build-static.sh两种方式。分发二进制文件Linux可以在构建时设置环境变量COMPRESS1使用 UPX 压缩生成的二进制文件显著减小分发体积build-static.sh 会在该变量生效时自动安装并启用 UPX 打包注意DEBUG_SYMBOLS设置时此选项被忽略。macOS可以在发送文件之前压缩它来减小文件大小推荐使用xz格式。小结FrankenPHP 的应用嵌入特性把应用 运行时 服务器整合为单一可执行文件让 PHP 应用的分发与部署变得像拷贝一个文件一样简单无需在目标机器安装 PHP、无需配置 Web 服务器、甚至可以在无根文件系统的scratch容器中直接运行。如需进一步了解静态构建的定制选项扩展、PHP 版本、额外的 Caddy 模块请阅读 静态构建文档若你的项目是 LaravelLaravel 独立二进制打包指南 提供了从构建、提取到artisan optimize、migrate、key:generate的完整实战步骤。【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考