在 FrankenPHP 中运行 Laravel 应用:Docker、本地安装、Octane 与独立二进制完整指南
在 FrankenPHP 中运行 Laravel 应用Docker、本地安装、Octane 与独立二进制完整指南【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphpFrankenPHP 是一个基于 Caddy 构建的现代 PHP 应用服务器它把 PHP 解释器、生产级 Web 服务器与自动 HTTPS 融为一体。本文以 Laravel 为具体落点系统讲解四种运行与分发 Laravel 应用的方式官方 Docker 镜像、本地二进制 Caddyfile、基于 Worker 模式的 Laravel Octane 高性能运行以及把整套 Laravel 应用打包成可独立执行的静态二进制。阅读本文后你将掌握从开发到生产部署、再到离线分发的完整实战路径。本文对应的仓库文档为 docs/es/laravel.md英文原版见 docs/laravel.md其中涉及的所有命令与配置均以当前仓库实际内容为准。一、用 Docker 镜像快速启动 Laravel 应用FrankenPHP 官方 Docker 镜像内置了 PHP、Caddy 以及默认的Caddyfile配置见仓库中的 caddy/frankenphp/Caddyfile。要运行一个 Laravel 项目只需把项目目录挂载到容器的/app目录docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp从 Laravel 项目根目录执行该命令即可。命令中各部分的含义-p 80:80映射 HTTP 端口-p 443:443映射 HTTPS 端口Caddy 会自动为localhost签发本地证书访问时使用https://localhost并接受自签名证书即可-p 443:443/udp映射 HTTP/3QUIC使用的 UDP 端口-v $PWD:/app把当前 Laravel 项目挂载到容器内的/app而 caddy/frankenphp/Caddyfile 中默认的root指向public/php_server指令会执行 PHP 文件并托管静态资源。[!TIP] 该镜像自带的Caddyfile还预留了SERVER_NAME、SERVER_ROOT、FRANKENPHP_CONFIG、CADDY_GLOBAL_OPTIONS等环境变量注入点并注释了 Mercure 与 Vulcain 模块的启用方式。修改站点配置更推荐通过环境变量或Caddyfile.d/*.caddyfile附加文件实现而不是直接改动镜像内配置。二、本地安装用 Caddyfile 运行 Laravel不想使用 Docker 时可以从官方发布的独立二进制入手。独立二进制自带 PHP 8.5 及多数常用扩展Linux 版本为静态链接无需安装任何系统依赖即可运行详见 README.md。下载对应你系统的二进制在 Laravel 项目根目录创建Caddyfile写入以下配置# Caddyfile { frankenphp } # 你的服务器域名 localhost { # 把 Web 根目录设置为 public/ root public/ # 启用压缩可选 encode zstd br gzip # 从 public/ 目录执行 PHP 文件并托管静态资源 php_server { try_files {path} index.php } }在 Laravel 项目根目录启动frankenphp run。这段配置对应的行为在 docs/config.md 中有更底层的解释php_server指令等价于一组 Caddy 路由——先为目录请求补尾部斜杠再通过try_files依次尝试请求路径、{path}/index.php与index.php把命中项重写为实际文件最后把*.php请求交给 FrankenPHP、其余交给file_server托管。这也是 Laravel 单入口public/index.php能够正常工作的原因。如果只是想快速演示或开发也可以不写Caddyfile直接使用php-server子命令见 caddy/php-server.gofrankenphp php-server --root public/三、Laravel Octane把应用常驻内存Laravel Octane 是 Laravel 官方的应用加速方案它让应用只引导bootstrap一次并常驻内存后续请求在毫秒级完成。FrankenPHP 的 Worker 模式正是 Octane 的底层支撑应用在 PHP 线程中长期存活请求到达时由frankenphp_handle_request()循环分发处理工作机制详见 docs/worker.md。安装与启动composer require laravel/octanephp artisan octane:install --serverfrankenphpoctane:install --serverfrankenphp会在应用内生成 Octane 配置文件并注册 FrankenPHP 服务器条目。启动命令为php artisan octane:frankenphpoctane:frankenphp命令支持的选项如下默认值以 Laravel Octane 官方实现为准选项作用默认值--host服务器绑定的 IP 地址127.0.0.1--port服务器监听端口8000--admin-portCaddy 管理 API 端口2019--workers处理请求的 Worker 数量auto自动探测--max-requests每个 Worker 处理多少请求后重启缓解内存泄漏500--caddyfile指定 FrankenPHP 的Caddyfile路径Laravel Octane 内置模板--https启用 HTTPS、HTTP/2、HTTP/3并自动签发与续期证书关闭--http-redirect启用 HTTP 到 HTTPS 的跳转仅在传--https时生效关闭--watch应用文件变化时自动重启服务器关闭--poll跨网络监视文件时改用文件系统轮询关闭--log-level按指定级别记录日志使用 Caddy 原生日志器关闭[!TIP] 需要结构化 JSON 日志例如接入日志分析平台时务必显式传入--log-level选项。关于--max-requests它对应 FrankenPHP 在 docs/config.md 中描述的max_requests机制PHP 并非为长驻进程设计库与旧代码存在内存泄漏风险时可在线程处理指定数量请求后将其整体重启清理全部内存与状态重启期间其他线程继续服务。四、把 Laravel 应用打包成独立二进制利用 FrankenPHP 的应用嵌入特性详见 docs/embed.md可以把 Laravel 应用连同 PHP 解释器、Caddy Web 服务器打包进一个自包含的静态二进制实现一个文件分发一个应用。以 Linux 为例按以下步骤操作1. 编写static-build.Dockerfile在应用仓库中创建# static-build.Dockerfile FROM --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否则构建出的二进制将不包含应用依赖。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-tmp4. 填充缓存frankenphp php-cli artisan optimize5. 执行数据库迁移如有frankenphp php-cli artisan migrate6. 生成应用密钥frankenphp php-cli artisan key:generate7. 启动服务器frankenphp php-server应用即告就绪。这里用到的php-cli子命令在 caddy/php-cli.go 中实现它把参数透传给 PHP 的 CLI SAPI 执行当二进制内嵌了应用frankenphp.EmbeddedAppPath非空且脚本路径不是绝对路径时会自动在嵌入目录中解析目标脚本因此artisan等命令可以开箱即用。如需为其他操作系统如 macOS构建或想进一步定制扩展、PHP 版本请参考 docs/embed.md 与 docs/static.md。五、修改存储路径适配内嵌应用的持久化默认情况下Laravel 会把上传文件、缓存、日志等写入应用内的storage/目录。这对内嵌应用并不合适——因为每次发布新版本二进制会被解压到不同的临时目录存储内容会随之丢失。解决办法是把存储目录指向临时目录之外的固定位置设置环境变量LARAVEL_STORAGE_PATH例如写入.env或在代码中调用Illuminate\Foundation\Application::useStoragePath()方法。二者任选其一即可让数据库迁移、缓存与用户上传数据跨版本持久保存。六、为 Laravel 应用接入 Mercure 实时推送Mercure 是一种基于 HTTP 的实时事件推送协议也是 WebSocket 的轻量替代方案现代浏览器原生支持。FrankenPHP 内置了 Mercure Hub仓库根目录的 docs/mercure.md 有完整说明界面如下因此 Laravel 应用无需额外部署 Hub 服务即可获得实时能力。未使用 Octane 时按 docs/mercure.md 在Caddyfile中启用mercure指令并配置 JWT 密钥即可Laravel 侧通过mercure_publish()函数、file_get_contents()请求或第三方库发布更新。使用 Octane 时在config/octane.php中加入以下配置启用内置 Hub// config/octane.php // ... return [ // ... mercure [ anonymous true, publisher_jwt !ChangeThisMercureHubJWTSecretKey!, subscriber_jwt !ChangeThisMercureHubJWTSecretKey!, ], ];anonymous允许匿名订阅publisher_jwt与subscriber_jwt是 Hub 签发与校验 JWT 的密钥生产环境务必替换为高强度随机值。Mercure 支持的全部 Hub 配置指令都可以写进这个数组例如subscriptions订阅 API、cors_origins跨域等。发布与订阅更新时推荐使用 Laravel Mercure Broadcaster 库不引入额外依赖时也可以参照 docs/mercure.md 用纯 PHPmercure_publish()与原生 JavaScriptEventSource实现客户端订阅/.well-known/mercure?topic...端点服务端发布带 JWT 授权的 POST 请求。七、把 Octane 应用也打包成独立二进制Octane 应用同样可以打包为独立二进制。步骤是先按第三节完成 Octane 的安装配置再按第四节完成打包之后通过 Octane 以 Worker 模式启动 FrankenPHPPATH$PWD:$PATH frankenphp php-cli artisan octane:frankenphp[!CAUTION] 该命令要能工作独立二进制必须命名为frankenphp并且要出现在PATH中因此上面的命令把当前目录加入了PATH——Octane 启动时需要在路径里找到一个名为frankenphp的程序。这一步的原理可以追溯到 caddy/php-cli.go 的实现php-cli会把当前二进制的路径作为argv[0]传入 PHP CLI SAPI而 Octane 正是借助这一点找到当前正在执行的服务器程序来启动 Workerdocs/worker.md 也明确指出 Laravel Octane 就是 FrankenPHP Worker 模式在框架层的官方集成。小结从开发到生产再到分发FrankenPHP 为 Laravel 提供了四档可选的运行形态Docker 镜像一行命令即可起步本地独立二进制配合Caddyfile适合常规部署Laravel Octane 借助 Worker 模式让应用常驻内存、请求响应达到毫秒级而嵌入特性则能把整个应用压缩进单个静态二进制实现真正的应用即文件。配合内置的 Mercure Hub 与自动 HTTPSLaravel 应用可以在不引入额外基础设施的前提下同时获得高性能与实时能力。更多底层机制可继续阅读 docs/config.md、docs/worker.md、docs/embed.md 与 docs/mercure.md。【免费下载链接】frankenphp The modern PHP app server项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Rnote:免费开源手写批注与绘图工具,从安装到导出的完整上手指南

Rnote:免费开源手写批注与绘图工具,从安装到导出的完整上手指南

Rnote:免费开源手写批注与绘图工具,从安装到导出的完整上手指南 【免费下载链接】rnote Sketch and take handwritten notes. 项目地址: https://gitcode.com/GitHub_Trending/rn/rnote 你有没有这种经历:手握数位板,打开批…

2026/10/25 16:33:50 阅读更多 →
内置式PMSM MTPA仿真:从磁阻转矩解析到Simulink模型实践

内置式PMSM MTPA仿真:从磁阻转矩解析到Simulink模型实践

简介:面向初学者的永磁同步电机MTPA(最大转矩每安培)控制仿真练习包,聚焦PMSM在单位电流下输出最大转矩的优化策略,适用于电动车、工业伺服等场合的电机控制学习。资源共4个文件,包含两个MATLAB脚本——MTP…

2026/11/9 15:12:06 阅读更多 →
aws-cli 中 set-type-default-version 命令详解:为 CloudFormation 注册表扩展类型设置默认版本

aws-cli 中 set-type-default-version 命令详解:为 CloudFormation 注册表扩展类型设置默认版本

aws-cli 中 set-type-default-version 命令详解:为 CloudFormation 注册表扩展类型设置默认版本 【免费下载链接】aws-cli Universal Command Line Interface for Amazon Web Services 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli 导读 本文…

2026/10/25 19:36:49 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/9 14:01:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/9 14:56:39 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/9 1:59:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/9 14:01:10 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/9 7:45:06 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/9 14:01:11 阅读更多 →

日新闻

周新闻

月新闻