讲师中心 微信公众号
AI工具推荐 视频效率加速

FrankenPHP 部署 Symfony 前后端分离项目配置

夏辰姑娘_6822

夏辰姑娘_6822

发布时间:2026-10-08 10:16:26

|

756人浏览过

|

来源于php中文网

原创

FrankenPHP 正确服务 Symfony 前后端需用 Caddyfile 显式分流:前端静态资源(dist/)通过 try_files 优先返回,API 路径(如 /api/*)明确 php_server 转发,SPA fallback 补 index.html;worker 模式须改用 symfony/runtime 入口并注入环境变量;HTTPS 需正确配置 SERVER_NAME、DNS 和持久化 /data 卷;跨域需绑定 0.0.0.0 并显式设 CORS 头。

frankenphp 部署 symfony 前后端分离项目配置

如何让 FrankenPHP 正确服务 Symfony 前端静态资源与后端 API

FrankenPHP 默认把 public/ 当作根目录,但前后端分离项目常把前端构建产物(如 Vue/React 的 dist/)放在独立路径,而 Symfony API 仍走 /api/ 或 /。若不显式区分,Caddy 的路由规则会把所有请求都交给 PHP 处理,导致静态文件 404 或 API 被错误重写。

核心是用 Caddyfile 的 handle + try_files 显式分流:

  • 前端静态文件(/ 下的 HTML/JS/CSS)优先匹配 dist/ 目录,命中则直接返回,不进 PHP
  • API 请求(如 /api/、/login)必须明确转发给 Symfony 的 index.php,否则路由失效
  • SPA 的 fallback(如 Vue Router 的 history 模式)需在静态规则末尾加 try_files {path} /index.html

示例 Caddyfile 片段:

your-domain.com {
    root * /app/dist
    # 前端静态资源:先找文件,再 fallback 到 index.html
    handle {
        try_files {path} {path}/ /index.html
    }
<pre class="brush:php;toolbar:false;"># 后端 API:只匹配 /api/* 和 /login 等显式路径,转给 Symfony
handle /api/* /login /logout {
    php_server
}

# 兜底:其他未匹配路径(如 /admin)也走 PHP,避免 404
handle {
    php_server
}

}

立即学习“PHP免费学习笔记(深入)”;

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

启用 worker 模式时 Symfony 容器初始化失败怎么办

worker 模式下,Symfony 容器在进程启动时初始化一次,之后复用。但默认的 Kernel::boot() 依赖每次请求的 $request 对象,而 worker 进程启动时没有真实请求上下文,直接调用会报 Request stack is empty 或 Environment variable not found。

必须改用 FrankenPHP 官方推荐的 SymfonyRuntime 启动方式,并确保 public/index.php 使用 frankenphp 兼容入口:

  • 确认已安装 symfony/runtime 包:composer require symfony/runtime
  • public/index.php 必须以 Runtime::get()->getRunner(...) 开头,不能手动 new Kernel
  • 环境变量(如 APP_ENV)需通过 ENV 文件或 Docker environment 注入,不能依赖 .env 本地加载(worker 进程不重读)
  • 禁用开发模式下的调试工具(如 WebProfilerBundle),它在常驻进程中可能引发内存泄漏

HTTPS 自动续期失败或证书不生效的常见配置点

FrankenPHP 内置 Caddy 的自动 HTTPS,但前后端分离项目容易因域名配置或 DNS 延迟导致 acme: error 或证书为自签名。

  • SERVER_NAME 环境变量必须设为完整域名(如 api.example.com),不能是 localhost 或 IP;裸域名(example.com)和 www(www.example.com)需分别申请或配置通配符
  • DNS A 记录必须提前生效,Let’s Encrypt 会做实时验证;若用 Cloudflare,需关闭代理(DNS only 模式),否则验证请求被拦截
  • Caddy 的证书存储路径(/data)必须持久化,Docker 中要用 volume 挂载,否则重启后证书丢失,触发新申请限频
  • 首次启动时若网络不通,Caddy 可能静默降级为自签名证书;检查日志中是否有 obtain certificate 成功字样,而非 using self-signed

为什么 php-server 命令启动后前端白屏、API 返回 500

这不是代码问题,而是 FrankenPHP 的默认行为:它只监听 127.0.0.1:8000,且不自动启用 CORS。前后端分离下,前端运行在 http://localhost:5173,浏览器发起的跨域请求会被拒绝,返回空响应或预检失败。

  • 启动时必须显式绑定到 0.0.0.0:frankenphp php-server --host 0.0.0.0:8000
  • 在 Caddyfile 中添加 CORS 头(尤其开发阶段):header Access-Control-Allow-Origin "*",生产环境应限定具体域名
  • Symfony 的 nelmio/cors-bundle 在 worker 模式下需额外配置 allow_origin 为数组,单字符串不生效
  • 检查 phpinfo() 输出中 $_SERVER['REQUEST_URI'] 是否含多余前缀(如被 Nginx 重写过),FrankenPHP 下该值应为原始路径

worker 模式省掉框架引导开销是实打实的,但它的代价是——你不能再把“每次请求都是干净沙盒”当作默认假设。环境变量、全局状态、数据库连接池、甚至 OPcache 的脚本缓存,都会跨请求延续。没意识到这点,就容易在压测时看到内存缓慢上涨或 session 错乱。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2323

2023.08.11

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6090

2024.03.19

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

5426

2024.03.19

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

10144

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6001

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2095

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3768

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4474

2023.10.23

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn