frankenphp不生效是因为symfony server:run调用php内置服务器,而frankenphp是go实现的独立sapi服务器,两者互斥;其实际路由由frankenphp_document_root、.frankenphp.json重写规则等控制。

不需要改 Symfony 写死的 server 参数,但得关掉 Symfony 自带的 Server 启动逻辑——FrankenPHP 本身是 SAPI 运行时,不是靠 php -S 那套。
为什么 Symfony 的 server:run 在 FrankenPHP 下不生效
Symfony 的 server:run 命令本质是调用 PHP 内置服务器(php -S),而 FrankenPHP 是一个基于 Go 的 HTTP 服务器 + PHP 运行时,它直接解析 PHP 文件并执行,不走 CLI SAPI 模式。所以:
• bin/console server:run 会启动一个独立的、和 FrankenPHP 无关的 PHP 内置服务
• 即使启动成功,请求也根本不会打到它上面,而是被 FrankenPHP 拦截处理
• 所有 $_SERVER 变量(比如 SERVER_NAME、REQUEST_URI)由 FrankenPHP 注入,不是 Symfony “写死”的那套默认值决定的
哪些 server 参数其实被 FrankenPHP 覆盖了
Symfony 的 server 相关配置(如 symfony.server.document_root 或 server:dump 输出的地址)在 FrankenPHP 环境下完全不参与请求路由或响应生成。真正起作用的是:
• FRANKENPHP_DOCUMENT_ROOT 环境变量(默认为 public/)
• FRANKENPHP_WORKERS(控制并发模型)
• .frankenphp.json 中的 rewrite 规则(替代 Apache/Nginx 的重写逻辑)
• public/index.php 入口文件是否被正确加载(FrankenPHP 默认只代理以 / 开头且匹配静态文件规则失败的请求给它)
常见错误:访问首页 404 或白屏
这通常不是因为 Symfony “写死了 server 参数”,而是 FrankenPHP 没找到或没正确执行 public/index.php。检查以下几点:
• 确保项目根目录下有 .frankenphp.json,内容至少包含:
{
"rewrite": {
"index": "index.php"
}
}
• 确认
public/index.php 存在且可读,且开头没有输出(如 BOM 或空格)• 如果用了自定义入口(如
public/app.php),需同步更新 .frankenphp.json 的 rewrite.index•
APP_ENV 和 APP_DEBUG 必须通过环境变量传入,不能依赖 .env 文件自动加载(FrankenPHP 不执行 Composer 的 autoload 初始化前逻辑)
要不要动 Symfony\Component\HttpKernel\ServerRequest 或 Request::createFromGlobals()
完全不用。FrankenPHP 已通过 SAPI 层把标准 CGI 变量注入 $_SERVER,Request::createFromGlobals() 能正常工作。唯一要注意的是:
• 如果你手动构造 ServerRequest 并硬编码了 http://localhost:8000 这类 URL,需要改成从 $_SERVER['HTTP_HOST'] 和 $_SERVER['REQUEST_SCHEME'] 动态获取
• $_SERVER['HTTPS'] 在反向代理后可能为 off,需配合 TRUSTED_PROXIES 和 TRUSTED_HEADERS 配置让 Symfony 正确识别安全连接
FrankenPHP 和 Symfony 的耦合点其实很薄——只要入口文件能跑通、环境变量到位、重写规则写对,就基本没问题。所谓“写死的 server 参数”多数是本地开发命令的残留概念,上线时本就不该依赖它们。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











