预发布环境必须用frankenphp run启动,因其加载caddyfile、启用worker模式并走完整http生命周期;frankenphp serve仅适用于本地调试,不支持worker且不读配置,无法模拟生产行为。

预发布环境必须用 frankenphp run 启动,不能用 frankenphp serve
预发布环境要模拟真实生产行为,而 frankenphp serve 是开发模式,不支持 worker、不加载 Caddyfile 路由规则、也不读 --php-config。上线流程验证失败,80% 是卡在这一步。
-
frankenphp serve只做静态文件+简单 PHP 执行,适合本地快速调试,但和线上完全不是同一执行路径 -
frankenphp run才真正加载 Caddyfile、启用 PHP worker、走完整 HTTP 生命周期,是唯一能验证上线流程的命令 - 启动时务必显式指定配置:
frankenphp run --config ./Caddyfile --php-config ./php.ini,避免依赖默认查找逻辑导致配置静默失效
检查 vendor/bin/frankenphp-worker.php 是否已重生成
这个文件是 Laravel/Symfony 在 worker 模式下的实际入口,它硬编码了框架初始化逻辑。改过 .env、config/app.php 或运行过 php artisan config:clear 后,它不会自动更新——必须手动重装。
- 执行
php artisan octane:install --server=frankenphp(Laravel)或composer require symfony/runtime && php bin/console frankenphp:install(Symfony),强制刷新 worker 脚本 - 用
ls -l vendor/bin/frankenphp-worker.php确认修改时间晚于你最近一次配置变更 - 直接运行
php vendor/bin/frankenphp-worker.php,看是否报错;若提示Class not found或Parse error,说明脚本本身已损坏,上线必然失败
验证 OPcache 和 worker 是否真生效,别信“看起来正常”
预发布环境最容易被忽略的是「配置写了,但没进 FrankenPHP 进程」。系统 php -m | grep opcache 无效,opcache_get_status() 返回空数组也常见——因为没走对 SAPI。
- 在路由里加一个临时 endpoint,返回
opcache_get_status()['opcache_enabled'] ?? false和getmypid(),连续发两个请求:PID 不变 + 返回true才算双达标 - 启动日志必须出现
Starting PHP worker pool with X workers,只看到Starting FrankenPHP server就是 worker 没启用 - 检查
php.ini中zend_extension=opcache.so和opcache.enable=1是否写在全局段(不是[cli]段),FrankenPHP 运行在embedSAPI 下,CLI 段配置会被忽略
HTTP/3 和 HTTPS 配置必须在预发布环境实测,不能跳过
Caddy 的自动 HTTPS 和 HTTP/3 在预发布阶段就该跑通。否则上线当天遇到证书申请失败、alt-svc 头缺失、curl --http3 返回 404,根本来不及救。
- 用
curl -I https://your-preprod-domain.com --http3测试,响应头必须含alt-svc: h3=":443"; ma=86400 - 访问
https://your-preprod-domain.com/frankenphp/phpinfo,搜索 “HTTPS” 和 “HTTP_HOST”,确认$_SERVER['HTTPS'] === 'on'且协议识别正确 - 如果用自签名证书或内网域名,Caddy 默认会拒绝 ACME 申请,需在 Caddyfile 全局块加
auto_https disable_redirects并手动配好tls internal或挂载证书文件
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











