
FrankenPHP 安装与快速上手指南基于 Caddy 的现代 PHP 应用服务器【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphpFrankenPHP 是构建在 Caddy Web 服务器之上的现代 PHP 应用服务器本文基于仓库中意大利语版 README 编写系统梳理其定位、全部安装途径脚本、独立二进制、rpm/deb/apk 包、Homebrew、Docker与基本用法php-server、php-cli、systemd 服务。读完本文你将能够依据自己的操作系统选择最合适的安装方式并立即把当前目录下的 PHP 应用跑起来同时了解如何用环境变量和 Caddyfile 对其进行定制。FrankenPHP 是什么Caddy 之上的 PHP 超能力FrankenPHP 的定位是一个现代 PHP 应用服务器其底层是 Go 编写的 Caddy Web 服务器。它给 PHP 应用带来的核心能力包括Early HintsHTTP 103 状态码提前推送Worker 模式应用常驻内存请求零重启开销实时通信能力内置 Mercure hub支持 Server-Sent Events热重载开发期文件变更即时生效自动 HTTPS、HTTP/2 与 HTTP/3 支持继承自 Caddy从仓库源码看FrankenPHP 的可执行程序本质上是一个Caddy 定制版入口文件 caddy/frankenphp/main.go 导入了 Caddy 标准模块、github.com/dunglas/frankenphp/caddy、Mercure 与 Vulcain 模块再调用caddycmd.Main()启动。也就是说frankenphp二进制就是一套预装了 PHP 处理能力的 Caddy。由于 PHP 通过 CGO 直接嵌入进程见根目录的 frankenphp.go、frankenphp.cFrankenPHP 可以用于任何 PHP 应用且与 Laravel、Symfony 的官方 worker 模式集成能让项目获得显著性能提升。此外它还提供独立的 Go 库形态允许在任意使用net/http的应用中嵌入 PHP对应 Go 库文档与 embed 指南。安装 FrankenPHP一键安装脚本在 Linux 和 macOS 上复制以下命令到终端即可自动安装与当前平台匹配的版本curl https://frankenphp.dev/install.sh | sh在 Windows 上于 PowerShell 中执行irm https://frankenphp.dev/install.ps1 | iex仓库根目录的 install.sh 与 install.ps1 即对应脚本的源码需要自定义安装路径或版本时可直接阅读。独立二进制官方为 Linux、macOS 和 Windows 提供内置PHP 8.5的 FrankenPHP 二进制Linux 二进制为静态链接可在任何 Linux 发行版上直接运行无需安装任何依赖macOS 二进制同样自包含三者均内置了大多数常用 PHP 扩展Windows 压缩包内含官方 Windows 版 PHP 二进制。静态构建的具体做法可参考仓库中的 static-builder-gnu.Dockerfile 与 static-builder-musl.Dockerfile以及 docs/static.md。rpm 包dnf 系发行版维护者提供了适用于所有使用dnf的系统的 rpm 包sudo dnf install https://rpm.henderkes.com/static-php-1-0.noarch.rpm sudo dnf module enable php-zts:static-8.5 # 可用版本从 8.2 到 8.5 sudo dnf install frankenphp安装扩展sudo dnf install php-zts-extension对于默认情况下未提供的扩展使用 PIEPHP Installer for Extensionssudo dnf install pie-zts sudo pie-zts install asgrim/example-pie-extensiondeb 包apt 系发行版维护者同样提供适用于所有使用apt的系统的 deb 包VERSION85 # 可用版本从 82 到 85 sudo curl https://pkg.henderkes.com/api/packages/${VERSION}/debian/repository.key -o /etc/apt/keyrings/static-php${VERSION}.asc echo deb [signed-by/etc/apt/keyrings/static-php${VERSION}.asc] https://pkg.henderkes.com/api/packages/${VERSION}/debian php-zts main | sudo tee -a /etc/apt/sources.list.d/static-php${VERSION}.list sudo apt update sudo apt install frankenphp安装扩展sudo apt install php-zts-extension默认未提供的扩展同样通过 PIE 安装sudo apt install pie-zts sudo pie-zts install asgrim/example-pie-extensionapk 包Alpine 系发行版针对使用apk的系统Alpine LinuxVERSION85 # 可用版本从 82 到 85 echo https://pkg.henderkes.com/api/packages/${VERSION}/alpine/main/php-zts | sudo tee -a /etc/apk/repositories KEYFILE$(curl -sJOw %{filename_effective} https://pkg.henderkes.com/api/packages/${VERSION}/alpine/key) sudo mv ${KEYFILE} /etc/apk/keys/ sudo apk update sudo apk add frankenphp安装扩展sudo apk add php-zts-extension默认未提供的扩展通过 PIE 安装sudo apk add pie-zts sudo pie-zts install asgrim/example-pie-extensionHomebrewmacOS / LinuxFrankenPHP 也以 Homebrew 包的形式提供brew install dunglas/frankenphp/frankenphp安装扩展使用 PIE 即可。三种包管理器形态的小结发行版家族包管理器扩展安装方式默认未提供的扩展Fedora/RHEL 系dnfsudo dnf install php-zts-extensionsudo pie-zts install packageDebian/Ubuntu 系aptsudo apt install php-zts-extensionsudo pie-zts install packageAlpine 系apksudo apk add php-zts-extensionsudo pie-zts install package上述包均以php-zts命名空间组织反映了 FrankenPHP 依赖ZTSZend Thread Safety构建的 PHP 线程安全特性——这是其多线程 worker 模型的底层前提。快速使用三种启动方式1. 作为 Web 服务器php-server在当前目录下直接服务站点内容frankenphp php-server这条命令来自 caddy/php-server.go 中注册的 Caddy 子命令其完整用法为frankenphp php-server [--domainexample.com] [--rootpath] [--listenaddr] [--worker/path/to/worker.php,nb-workers] [--watch[glob-pattern]]... [--access-log] [--debug] [--no-compress] [--mercure]各标志的作用依据 caddy/php-server.go 的 flag 定义--domain/-d指定域名后默认监听地址会切换为 HTTPS 端口并启用自动 HTTPS若使用公网域名需先确保 A/AAAA 记录正确解析--root/-r站点根目录默认使用当前目录--listen/-l自定义监听地址不带域名时默认监听:80带域名时默认监听 HTTPS 端口443--worker/-w指定 worker 脚本格式为脚本路径,工作线程数可多次传入--watchworker 模式下监视文件变更并自动重启 worker 的 glob 模式可多次传入--access-log/-a启用访问日志--debug/-v输出详细调试日志对应内部日志级别设为debug见 caddy/php-server.go--mercure/-m启用内置的 Mercure.rocks hub--no-compress关闭 Zstandard、Brotli 与 Gzip 压缩。从 caddy/php-server.go 的实现可以看到该命令在内部构造了一条完整的 Caddy 路由链encode压缩→ 目录规范化重定向308→try_files重写到index.php→ 匹配*.php的php处理器 → 兜底file_server静态文件并设置了 10s 读头超时、30s 空闲超时与 16 KiB 最大请求头限制caddy/php-server.go。换言之一条php-server命令就等价于一个生产可用的 PHP 静态资源服务器。2. 运行命令行脚本php-cliFrankenPHP 也可以像 PHP CLI SAPI 一样执行脚本frankenphp php-cli /path/to/your/script.php其实现位于 caddy/php-cli.go命令会按 PHP CLI 的约定把argv[0]保留为程序自身然后调用 cli.go 中的ExecuteScriptCLI最终经 CGO 进入 frankenphp.c 的frankenphp_execute_script_cli执行脚本并返回退出码。因此php-cli的退出码与脚本exit()的结果一致可直接用于 shell 流程控制。3. 作为系统服务systemd使用 deb 或 rpm 包安装时还可以直接启动 systemd 服务sudo systemctl start frankenphp对应的服务单元文件可见于 package/debian/frankenphp.service 与 package/rhel/frankenphp.service安装后可通过systemctl enable frankenphp设置开机自启。使用 Docker 运行官方提供 Docker 镜像一条命令即可启动docker run -v .:/app/public \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp注意端口映射中同时包含了443/tcp与443/udp后者用于 HTTP/3QUIC。随后打开https://localhost即可访问。[!TIP]不要使用https://127.0.0.1。请使用https://localhost并接受自签名证书。 如需更换域名通过SERVER_NAME环境变量 修改。Docker 镜像内部默认使用仓库 caddy/frankenphp/Caddyfile 作为配置站点根目录为{$SERVER_ROOT:public/}启用encode zstd br gzip压缩并通过php_server指令处理 PHP 请求Caddyfile.d/目录下的*.caddyfile会被自动导入便于按站点追加配置。关于镜像的更多细节可参考 docs/docker.md。配置概览Caddyfile、环境变量与 php.iniFrankenPHP、Caddy 以及 Mercure、Vulcain 模块都可以用 Caddy 支持的配置格式最常见的是Caddyfile进行配置。默认情况下 FrankenPHP 会在当前目录查找Caddyfile也可用-c/--config指定路径。一个最小的站点配置是# 要响应的主机名 localhost # 可选指定站点根目录否则使用当前目录 #root public/ php_serverphp_server或更底层的php指令可在站点块内使用。完整参数说明root、split_path、env、worker、match等以及 worker 监视、max_requests线程重启、php_ini指令、SERVER_NAME/SERVER_ROOT/CADDY_GLOBAL_OPTIONS/FRANKENPHP_CONFIG环境变量、各安装方式下php.ini的查找路径等详见意大利语版 配置指南中文读者亦可参考 docs/config.md。一个关键提示FrankenPHP 默认会对所有主机名包括localhost自动启用 HTTPS。若在纯开发环境想禁用可将SERVER_NAME设为http://或:80。使用 HTTP/1.x 进行实时通信Mercure、WebSocket、SSE时可能需要在全局选项中开启enable_full_duplex。启用 debug 模式则可通过-e CADDY_GLOBAL_OPTIONSdebug注入 Docker 容器。文档地图以下是仓库内与本文相关的全部官方文档路径均已转换为仓库根目录相对路径经典模式Worker 模式从 Nginx/PHP-FPM 迁移Early HintsHTTP 103支持实时通信Mercure日志热重载高效服务大文件X-Sendfile配置用 Go 编写 PHP 扩展Docker 镜像生产环境部署性能优化创建自包含、自执行的 PHP 应用创建静态二进制从源码编译可观测性WordPress 集成Symfony 集成Laravel 集成已知问题内部架构概览贡献与调试仓库根目录另有 CONTRIBUTING.md生态集成与项目骨架FrankenPHP 社区围绕主流 PHP 框架和 CMS 提供了大量集成示例与项目骨架仓库文档中收录了可直接参考的官方指南Symfonydocs/symfony.mdSymfony 是官方维护 worker 模式集成的主要框架之一API Platform基于 Symfony 的 API 平台与 FrankenPHP 的实时能力配合良好Laraveldocs/laravel.md官方提供 worker 模式集成与 Octane 兼容方案WordPressdocs/wordpress.md社区提供frankenwp等一键式项目骨架Drupal、Joomla、TYPO3、Magento2、Sulu均有对应的社区集成项目可作为生产部署的参考起点。无论你使用何种框架FrankenPHP 的 Worker 模式都是获得最大性能收益的关键路径应用只启动一次并常驻内存每个请求复用同一进程彻底省去传统 PHP-FPM 模式请求进来再编译执行的开销。想要深入了解其底层实现可以从根目录 worker.go 的worker结构体入手其中num初始线程数、maxThreads、maxConsecutiveFailures连续失败重启阈值等字段直接对应 Caddyfile 中的 worker 配置项。至此你已经掌握了从安装到运行 FrankenPHP 的完整路径选择适合自己系统的安装方式脚本 / 二进制 / 系统包 / Docker用php-server或php-cli立即跑起应用再通过 Caddyfile 与环境变量完成个性化配置最后按需查阅上文的文档地图深入各个专题。【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考