frankenphp本地启动symfony需确保项目结构标准且public/为文档根,运行frankenphp php-server即可;但必须配置.env.local设app_env=prod、app_debug=0,并清除生产缓存,否则因缺少webprofilerbundle资源导致白屏。

本地启动 Symfony 项目用 frankenphp php-server
直接运行 frankenphp php-server 即可,前提是你的 Symfony 项目已按标准结构组织,且 public/ 是文档根目录。FrankenPHP 默认会把当前目录下的 public/ 当作 Web 根,自动加载 public/index.php —— 这和 Symfony 官方推荐的开发服务器行为一致。
常见错误现象:404 Not Found 或 Failed to open stream: No such file or directory,基本都是因为没进对目录,或者 public/ 下缺 index.php(比如你误删了,或还没执行 composer install)。
使用场景:日常开发调试、热重载不敏感的后端逻辑验证。它不提供像 symfony server:start 那样的文件监听和自动重启,但胜在轻量、无额外依赖。
必须提前设置 .env.local 并禁用 APP_DEBUG
FrankenPHP 启动时不会自动读取 .env 的开发配置,如果你沿用默认的 APP_ENV=dev + APP_DEBUG=1,会触发 Symfony 的全量 debug 工具栏和异常页面 —— 但 FrankenPHP 没集成 WebProfilerBundle 的前端资源路由,结果就是页面白屏或报 Asset not found 错误。
实操建议:
- 在项目根目录下创建
.env.local,写入:APP_ENV=prod APP_DEBUG=0
- 确保
config/packages/prod/下有完整覆盖(尤其是web_profiler.yaml要被禁用) - 运行
php bin/console cache:clear --env=prod再启动,否则缓存仍可能残留 dev 配置
frankenphp php-server 不支持 --watch,别指望热重载
它本质是 Caddy + 嵌入 PHP 运行时的常驻进程,没有文件监听模块。改了 src/Controller/ 或 templates/ 后,必须手动中断 Ctrl+C 再重跑命令,否则看到的永远是旧响应。
替代方案(按推荐度排序):
- 开发阶段用
symfony server:start(兼容性最好,调试体验最完整) - 想提前验证 FrankenPHP 行为,就只在关键路径(如 API 接口)上切过去测试
- 真要热重载,得自己套
entr或nodemon监听 PHP 文件变化并重启进程,但容易引发 Caddy 端口占用冲突
Docker 启动时注意 volumes 映射路径
用 Docker 运行时,-v $PWD:/app/public 是最简写法,但 Symfony 项目实际需要的是整个项目目录(不只是 public/),否则 bin/console、config/、src/ 都不可见,会导致 autoloader 失败或环境变量读不到。
正确做法是:
- 把项目根映射到
/app,再通过Caddyfile显式指定root * /app/public - 或用官方推荐的
docker run -v $PWD:/app dunglas/frankenphp,然后靠内置逻辑自动识别/app/public - 千万别写成
-v $PWD/public:/app/public—— 这会让 Symfony 找不到vendor/和config/,报Class not found
真正容易被忽略的是:FrankenPHP 的 worker 模式(--workers)在本地开发几乎没意义。它针对的是生产环境的长连接与容器复用,而本地请求间隔大、并发低,开了反而增加内存占用和调试复杂度。先跑通 php-server,再考虑是否启用 worker。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











