frankenphp启动失败、请求空白、队列不执行、https失效,主因是配置未对齐或未切换至常驻模型:需正确安装frankenphp-worker.php、用request()替代$_server、单独运行queue:work、在frankenphp.yaml中配置tls/http/3。

FrankenPHP 启动失败、请求空白、队列不跑、HTTPS 不生效——这些问题基本都出在「配置没对齐」或「模式没切换」上,不是框架 bug,而是常驻模型和传统 PHP 的运行逻辑冲突导致的。
frankenphp-worker.php 找不到或 permission denied
这是 php artisan octane:install --server=frankenphp 没真正跑完的典型表现。Laravel Octane 安装时会下载 FrankenPHP 二进制并生成 vendor/bin/frankenphp-worker.php,但这个步骤容易被跳过:
- 必须显式执行
php artisan octane:install --server=frankenphp,只composer require laravel/octane不够 - 检查
vendor/bin/frankenphp是否存在且可执行:ls -l vendor/bin/frankenphp;若权限不足,运行chmod +x vendor/bin/frankenphp - Docker 或 CI 环境中,
octane:install可能因无交互而静默失败,建议在构建阶段加echo "Installing FrankenPHP..." && php artisan octane:install --server=frankenphp || true并手动验证文件 - Windows 用户需确认已启用 WSL2;原生 Windows 不支持(Go 编译的二进制无 Windows 版)
请求返回空白或路由错乱
本质是常驻进程下 $_SERVER 没刷新。Swoole 和 FrankenPHP 都复用 worker 进程,首次请求后 $_SERVER 就固化为快照,后续请求不会自动更新。
- 把
$_SERVER['REQUEST_URI']换成request()->fullUrl(),$_SERVER['REQUEST_METHOD']换成request()->method() - 不要在
bootstrap/app.php或服务提供者register()中读取$_SERVER['HTTP_HOST']做动态配置,改用中间件或请求生命周期内解析 - 判断 HTTPS 请用
request()->secure(),而不是$_SERVER['HTTPS'] === 'on' - 代码热重载必须用
php artisan octane:reload,不要kill -USR1,否则可能复用旧$_SERVER快照
队列任务不执行、事件没广播
php artisan octane:start 只接管 HTTP 请求,它不管队列、广播、定时任务这些后台生命周期。
- 队列必须单独启动:
php artisan queue:work --once(配合 Supervisor)或 Laravel 10+ 推荐的php artisan queue:listen -
--daemon已弃用,别再用;它和 Octane 的内存模型冲突,易导致内存泄漏 - 广播事件(如 Mercure、Redis)需确保广播驱动独立运行,不能依赖 Octane 进程
- 定时任务仍走
php artisan schedule:run,由系统 cron 触发,和 Octane 无关
Caddy 配置没生效、HTTP/3 或自动证书失败
FrankenPHP 内置 Caddy,但默认不加载项目根目录的 Caddyfile,它只认 frankenphp.yaml 或环境变量驱动的配置。
- HTTPS 自动续期需要明确启用:在
frankenphp.yaml中设http.tls.automatic_https: on,并确保域名 DNS 解析正确、80/443 端口可访问 - HTTP/3 要求 TLS + QUIC,Caddy 默认开启,但客户端需支持;测试可用
curl -v --http3 https://yourdomain.com - 静态文件服务路径要和
php.script_path对齐,否则 404;例如script_path: "/var/www/html",则GET /js/app.js实际读的是/var/www/html/js/app.js - 重写规则、反向代理等高级功能必须写在
frankenphp.yaml的http.routes下,Caddyfile 不会被读取
最常被忽略的一点:FrankenPHP 的「常驻」特性是双刃剑——它省掉了冷启动,但也要求你彻底放弃「每个请求都是全新环境」的惯性思维。所有依赖请求上下文的逻辑,都得从 $_SERVER 搬到 request(),所有后台任务都得脱离 HTTP 进程单独管理。这不是配置问题,是模型切换。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











