FrankenPHP 运行 Laravel 全攻略Docker 部署、Caddyfile 配置、Octane 加速与独立二进制打包【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp本篇技术指南完整讲解如何在 FrankenPHPThe modern PHP app server内置 PHP 解释器的 Caddy Web 服务器上运行 Laravel 应用的四种主流方案Docker 镜像一键部署、本地二进制 Caddyfile 配置、Laravel Octane 常驻内存加速以及将整个 Laravel 应用打包为无依赖的独立静态二进制。读完本文你将掌握每种方案的完整配置与命令、octane:frankenphp的全部参数并能结合仓库源码理解php-cli、php-server、worker 模式与嵌入embed特性的底层原理。为什么选择 FrankenPHP 承载 LaravelFrankenPHP 将 PHP 解释器、Caddy Web 服务器与 PHP 应用融合为单一进程天然具备生产级 HTTP 服务器能力自动 HTTPS、HTTP/2、HTTP/3、压缩等并可通过 worker 模式让 PHP 应用常驻内存、大幅削减每次请求的引导开销。对于 Laravel 开发者而言官方 Docker 镜像与独立二进制两种分发形态分别覆盖了快速开发与轻量交付两个典型场景。方式一使用官方 Docker 镜像运行 Laravel官方 Docker 镜像Dockerfile已内置 FrankenPHP 二进制、默认的 Caddyfile 配置与 PHP 环境工作目录固定为/app。因此把 Laravel 项目挂载到镜像的/app目录即可直接对外提供服务docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp从 Laravel 应用的主目录执行该命令即可。参数说明-p 80:80、-p 443:443分别暴露 HTTP 与 HTTPS 端口-p 443:443/udp暴露 HTTP/3基于 QUIC/UDP端口对应 Dockerfile 中的EXPOSE 80、EXPOSE 443、EXPOSE 443/udp-v $PWD:/app将当前目录你的 Laravel 项目挂载为镜像的 Web 根目录。镜像默认的入口会以frankenphp run启动并加载/etc/frankenphp/Caddyfile该文件由 caddy/frankenphp/Caddyfile 生成。仓库提供的默认站点配置与本文推荐的 Laravel 配置高度一致——站点根目录为public/、开启zstd br gzip压缩、使用php_server指令执行 PHP 文件。此外镜像还提供了FRANKENPHP_CONFIG环境变量用于注入额外配置例如开启 worker 模式docker run \ -e FRANKENPHP_CONFIGworker /app/public/index.php \ -v $PWD:/app \ -p 80:80 -p 443:443 -p 443:443/udp \ dunglas/frankenphp该变量会被插入到默认 Caddyfile 的frankenphp { ... }全局块中见 caddy/frankenphp/Caddyfileworker 模式的完整说明见 docs/worker.md。方式二本地安装与 Caddyfile 配置如果你更倾向于在本机直接运行可以下载与操作系统对应的 FrankenPHP 独立二进制参考根目录 README.md 的 standalone binary 章节然后在 Laravel 项目根目录创建一个名为Caddyfile的文件{ frankenphp } # 你的服务器域名 localhost { # 将 Web 根目录设置为 public/ root public/ # 启用压缩可选 encode zstd br gzip # 从 public/ 目录执行 PHP 文件并托管静态资源 php_server { try_files {path} index.php } }逐段解读全局块{ frankenphp }启用 FrankenPHP 的 PHP 处理模块localhost站点块这里以本地开发域名为例生产环境请替换为你的真实域名指定域名后 FrankenPHP 会自动签发并续期 Lets Encrypt 证书启用 HTTPS/HTTP/2/HTTP/3root public/Laravel 的入口目录是public/必须将根目录指向它否则框架入口无法被正确解析encode zstd br gzip依次启用 Zstandard、Brotli、Gzip 三种压缩编码由 Caddy 的encode模块按客户端协商结果选择php_servertry_files {path} index.php这是 Laravel 前端控制器模式的标准写法——先尝试按请求路径匹配静态文件找不到时回退到index.php由框架路由接管。配置完成后在 Laravel 项目根目录启动frankenphp runfrankenphp run会读取当前目录或通过--config指定的Caddyfile 并启动服务器。需要更灵活的场景时还可以使用frankenphp php-server命令直接以零配置方式起一个 PHP 服务器详见下文独立二进制一节。Laravel Octane让应用常驻内存Laravel Octane 是 Laravel 官方的高性能应用服务器方案它把应用预热一次并常驻内存使请求处理吞吐大幅提升这与 FrankenPHP 的 worker 模式天然契合——Octane 的 FrankenPHP 驱动正是建立在 worker 模式之上的。安装与启动先用 Composer 安装 Octanecomposer require laravel/octane然后执行octane:install它会将 Octane 的配置文件安装到你的应用中--serverfrankenphp指定使用 FrankenPHP 作为驱动php artisan octane:install --serverfrankenphp启动 Octane 服务器php artisan octane:frankenphpoctane:frankenphp 的可用选项选项含义默认值--host服务器绑定的 IP 地址127.0.0.1--port服务器监听的端口8000--admin-port管理服务器Caddy Admin API端口2019--workers用于处理请求的 worker 数量auto--max-requests每处理多少请求后重启一次 worker500--caddyfileFrankenPHPCaddyfile的路径Octane 内置的 Caddyfile 模板stub--https启用 HTTPS、HTTP/2 与 HTTP/3并自动生成和续期证书关闭--http-redirect将 HTTP 请求重定向到 HTTPS仅在传入--https时生效关闭--watch应用文件发生变化时自动重载服务器关闭--poll监听文件时使用文件系统轮询适用于网络文件系统上的文件监听关闭--log-level按指定级别或更高级别输出日志使用 Caddy 原生 logger—[!TIP] 如需输出结构化 JSON 日志便于对接日志分析平台请显式传入--log-level选项。从实现层面看--workers与--max-requests分别对应 FrankenPHP worker 模式的 worker 数量与按请求数重启策略docs/worker.md 中介绍了MAX_REQUESTS环境变量与max_consecutive_failures等配置--admin-port暴露的正是 Caddy 管理 API可通过curl -X POST http://localhost:2019/frankenphp/workers/restart优雅重启全部 worker。--watch底层由仓库的 watcher 模块与hot-reload特性支撑见 docs/hot-reload.md。将 Laravel 应用打包为独立二进制借助 FrankenPHP 的应用嵌入embed特性可以把Laravel 应用源码 PHP 解释器 Caddy 服务器压缩进一个可执行文件。交付时不再需要安装 PHP、Composer 或任何运行时依赖非常适合分发给客户、部署到内网服务器等场景。以下步骤以 Linux 为例。1. 编写 static-build.Dockerfile在应用仓库中创建static-build.DockerfileFROM --platformlinux/amd64 dunglas/frankenphp:static-builder-gnu # 如果你打算在 musl-libc 系统上运行该二进制请改用 static-builder-musl # 复制你的应用 WORKDIR /go/src/app/dist/app COPY . . # 移除测试等无用文件以减小体积 # 也可以把这些文件加入 .dockerignore RUN rm -Rf tests/ # 复制 .env 文件 RUN cp .env.example .env # 将 APP_ENV 与 APP_DEBUG 调整为生产环境 RUN sed -i -e s/^APP_ENV.*/APP_ENVproduction/ -e s/^APP_DEBUG.*/APP_DEBUGfalse/ .env # 按需修改 .env 中的其他配置 # 安装依赖 RUN composer install --ignore-platform-reqs --no-dev -a # 构建静态二进制 WORKDIR /go/src/app/ RUN EMBEDdist/app/ ./build-static.sh[!CAUTION] 部分.dockerignore文件会忽略vendor/目录和.env文件。构建前务必调整或删除.dockerignore否则应用依赖与环境配置不会被打进二进制。该 Dockerfile 基于仓库提供的 static-builder-gnu.Dockerfile 静态构建镜像glibc 变体EMBEDdist/app/告诉构建脚本将dist/app/即你的应用嵌入最终二进制。2. 构建镜像docker build -t static-laravel-app -f static-build.Dockerfile .3. 提取二进制docker cp $(docker create --name static-laravel-app-tmp static-laravel-app):/go/src/app/dist/frankenphp-linux-x86_64 frankenphp ; docker rm static-laravel-app-tmp当前目录下得到的frankenphp就是自包含的可执行文件。4. 初始化应用php-cli嵌入后的二进制内置了完整的 PHP CLI 能力——caddy/php-cli.go 注册了php-cli子命令其底层调用frankenphp.ExecuteScriptCLI()见 cli.go以 PHP CLI SAPI 方式执行脚本。因此可以直接在二进制内运行 Artisan 命令frankenphp php-cli artisan optimizefrankenphp php-cli artisan migratefrankenphp php-cli artisan key:generate依次完成生成/填充各类缓存、执行数据库迁移如有、生成应用密钥。这三步都属于写操作在嵌入只读二进制的场景下建议在发布前完成。5. 启动服务器php-serverfrankenphp php-serverphp-server是 caddy/php-server.go 注册的生产级 PHP 服务器命令常用选项包括--domain指定域名自动启用 HTTPS、--root站点根目录、--listen监听地址、--workerworker 脚本可带,数量后缀、--watch文件变更自动重载、--access-log、--mercure启用内置 Mercure hub等。当检测到应用嵌入路径且根目录存在自定义Caddyfile时它会自动加载该配置见 caddy/php-server.go因此你也可以在应用根目录放一份自定义 Caddyfile 来覆盖默认行为。至此你的 Laravel 应用已作为一个独立二进制运行起来。嵌入式应用的注意事项更改存储路径Laravel 默认把上传文件、缓存、日志等写入应用目录下的storage/。这对嵌入式应用并不合适——因为每次新版本二进制运行时应用会被解压到不同的临时目录storage/数据无法持久。解决办法有两种设置环境变量LARAVEL_STORAGE_PATH例如写入你的.env文件指定一个临时目录之外的固定路径或调用Illuminate\Foundation\Application::useStoragePath()方法在应用引导阶段把存储路径指向外部目录。用独立二进制运行 Octane独立二进制同样可以运行 Laravel Octane按上文Laravel Octane一节安装好 Octane并按独立二进制一节完成打包后以如下方式启动worker 模式PATH$PWD:$PATH frankenphp php-cli artisan octane:frankenphp[!CAUTION] 该命令要生效独立二进制必须命名为frankenphp并出现在PATH中因为 Octane 需要调用一个名为frankenphp的程序。PATH$PWD:$PATH正是把当前目录二进制所在处临时加入PATH。进阶为 Laravel/Octane 启用 Mercure 实时推送FrankenPHP 内置了 Mercure hub可向浏览器实时推送事件是 WebSocket 的轻量替代方案Laravel 官方文档的 Mercure 支持 章节也收录了此用法。若未使用 Octane直接在 Caddyfile 中按 docs/mercure.md 的示例启用mercure指令即可。若使用 Octane则在config/octane.php中添加如下配置// config/octane.php // ... return [ // ... mercure [ anonymous true, publisher_jwt !ChangeThisMercureHubJWTSecretKey!, subscriber_jwt !ChangeThisMercureHubJWTSecretKey!, ], ];该数组支持 Mercure hub 的全部指令anonymous表示允许匿名订阅者publisher_jwt与subscriber_jwt为发布者/订阅者 JWT 签名密钥生产环境务必更换。发布更新可借助 FrankenPHP 提供的mercure_publish()函数签名见 docs/mercure.md或使用社区维护的 Laravel Mercure Broadcaster 库与原生EventSource订阅纯 PHP/JavaScript 的完整示例同样在 docs/mercure.md 中。小结围绕 Laravel 与 FrankenPHP 的组合本文覆盖了四条落地路径Docker挂载/app目录即可运行适合快速开发与 CI 环境本地安装独立二进制 Caddyfileroot public/、encode、php_server适合本机调试Laravel Octaneoctane:install --serverfrankenphpoctane:frankenphp借助 worker 模式实现常驻内存参数覆盖 host、port、workers、max-requests、HTTPS、watch 等独立二进制通过static-build.Dockerfile将应用嵌入静态二进制配合php-cli执行 Artisan、php-server启动服务实现零运行时依赖的分发。无论选择哪种方式仓库中的 docs/embed.md、docs/worker.md、docs/mercure.md 以及 caddy/frankenphp/Caddyfile 默认配置都是继续深入 FrankenPHP 能力边界的绝佳入口。【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考