FrankenPHP 是 Laravel Octane 最轻量、开箱即用的现代驱动,需 PHP ≥ 8.1、public/ 目录含 index.php,不支持 Windows WSL1 或旧版 Docker Desktop。

FrankenPHP 是目前 Laravel Octane 中最轻量、开箱即用的现代驱动选择,它用 Go 编写,自带 HTTP/2、HTTP/3、Brotli 和 Zstandard 压缩支持,无需额外配置 Nginx 反向代理就能直接对外提供服务。但它的行为和传统 PHP-FPM 或 Swoole 有本质差异——不是“装上就能跑”,而是要接受它对请求生命周期、静态文件处理和环境变量的强约定。
FrankenPHP 驱动必须满足的硬性条件
不满足以下任一条件,php artisan octane:start --server=frankenphp 会直接失败或启动后无法响应:
- PHP 版本必须 ≥ 8.1(
php -v确认),低于 8.1 会报Class "JsonException" not found类错误 - 项目根目录下必须存在
public/子目录,且其中包含index.php;FrankenPHP 不兼容自定义入口路径 - 不能在 Windows WSL1 或旧版 Docker Desktop(
-
config/octane.php中的'server'必须显式设为'frankenphp',不能留空或设为'swoole'却强行指定--server=frankenphp
安装时 octane:install --server=frankenphp 实际做了什么
这个命令不只是写配置,它会触发三件关键动作:
- 自动下载对应平台的
frankenphp二进制到vendor/bin/frankenphp,并赋予可执行权限(Linux/macOS) - 生成
Caddyfile(默认在项目根目录),用于接管 HTTP 路由和 TLS 终止;它不是示例文件,Octane 启动时会真实加载它 - 重写
server.php入口,把$_SERVER的初始化逻辑交给 FrankenPHP 的 Caddy worker 脚本,而不是 Laravel 默认逻辑
如果你手动删过 Caddyfile,下次启动会报错 Failed to load Caddyfile: open Caddyfile: no such file or directory,必须重新运行 php artisan octane:install --server=frankenphp 或手动恢复。
立即学习“PHP免费学习笔记(深入)”;
启动后 404 或静态资源 404 的常见原因
FrankenPHP 默认通过 Caddy 提供静态文件服务,但它的路径解析和 Laravel 的 public 目录绑定极紧:
- 浏览器访问
http://localhost:8000/css/app.css返回 404?检查Caddyfile中root指令是否为root * public(注意末尾无斜杠) - API 接口返回 404,但
php artisan route:list显示路由存在?说明 Octane 没加载到最新路由缓存——必须先运行php artisan config:clear && php artisan route:clear,再启动 - HTTPS 页面里混入
http://的资源链接,被浏览器拦截?FrankenPHP 的--https参数只启用 HTTPS 监听,不自动重写响应体中的 URL;需在应用层用URL::forceScheme('https')或中间件修正 - 修改了
Caddyfile但重启后没生效?FrankenPHP 不热重载 Caddy 配置,必须停掉进程(php artisan octane:stop)再重新start
开发中如何安全地调试 FrankenPHP 工作流
FrankenPHP 的 Go 进程和 PHP Worker 是分离的,出错时日志分散在两处:
- PHP 层错误(如未捕获异常)会输出到终端 stdout/stderr,和
php artisan octane:start启动时看到的一样 - Caddy 层错误(如 TLS 握手失败、路由匹配异常)默认写入
storage/logs/frankenphp.log,不是laravel.log - 想看完整请求链路,启动时加
--verbose:php artisan octane:start --server=frankenphp --verbose - 遇到 “connection refused” 却没报错?大概率是端口被占用;FrankenPHP 默认监听
0.0.0.0:8000,用lsof -i :8000(macOS/Linux)或netstat -ano | findstr :8000(Windows)确认
FrankenPHP 最容易被忽略的点是:它不共享 PHP-FPM 的 php.ini 加载逻辑,所有 ini_set() 或 php_flag 配置在 Caddyfile 里无效,必须通过 php_admin_value 或环境变量传入,比如内存限制得靠 PHP_MEMORY_LIMIT=256M 环境变量控制。



















