frankenphp run 读取 caddyfile 配置并启动完整应用服务器,支持 https、路由等高级功能;frankenphp php-server 是轻量模式,不读配置,仅以当前目录为根在 localhost:8080 提供 php 服务,适合快速验证。

frankenphp run 和 frankenphp php-server 有什么区别
两者都启动 HTTP 服务,但行为和适用场景完全不同:frankenphp run 是完整应用服务器模式,会自动查找当前目录下的 Caddyfile,按其中配置加载静态资源、TLS、路由规则,并执行 php_server 指令;而 frankenphp php-server 是轻量级开发快捷命令,不读取任何 Caddyfile,直接把当前目录当作 Web 根,用默认端口(8080)提供 PHP 脚本服务,适合快速验证单个 index.php。
容易踩的坑:
-
frankenphp php-server不支持 HTTPS、HTTP/2/3、重写规则或自定义 MIME 类型 - 若项目已有
Caddyfile却误用php-server,所有配置(如root public/、encode gzip)都会被忽略 -
php-server默认监听localhost:8080,不能绑定到0.0.0.0或其他端口,需改用frankenphp run --config配合自定义 Caddyfile
worker 模式必须改代码吗
是的,启用 worker 模式后,PHP 生命周期不再由 FrankenPHP 自动管理,而是交由你控制。框架无法再依赖传统的“一次请求、一次启动”模型,必须显式调用 frankenphp_handle_request() 来接收并处理每个请求。
典型适配步骤:
- 入口文件(如
public/index.php)需包裹在循环中,调用frankenphp_handle_request($handler) -
$handler必须返回一个Psr\Http\Message\ResponseInterface实例,且不能提前exit或die - Laravel、Symfony、ThinkPHP 等主流框架已有适配文档,但 ThinkPHP 6/8 的
frankenphp_handle_request入口需注意:必须在$http->run()后调用$http->end($response),否则连接不会正确关闭 - 禁用
opcache.enable_cli=1—— worker 模式下 CLI 配置会被继承,可能导致类重定义错误
为什么访问 https://localhost 报证书错误
这是正常现象。FrankenPHP 使用 Caddy 的本地 PKI 模块为 localhost 自动生成自签名证书,浏览器不信任该根证书,所以会显示“您的连接不是私密连接”。它不是配置错误,也不是证书过期。
解决方法只有两种:
- 手动将 Caddy 生成的根证书导入系统信任库:证书路径通常是
~/.local/share/caddy/pki/authorities/local/root.crt(Linux/macOS)或%LOCALAPPDATA%\Caddy\pki\authorities\local\root.crt(Windows) - 开发阶段直接点击“高级 → 继续前往 localhost(不安全)”,不影响功能验证
注意:Docker 容器内运行时,宿主机证书不可见,此时必须挂载证书目录或改用 --insecure 启动参数(仅限测试)
docker run 启动后访问 404 或空白页
最常见原因是挂载路径与 Caddyfile 中的 root 设置不匹配。FrankenPHP Docker 镜像默认配置的 Caddyfile 假设项目根目录结构为 /app/public/,且 root 指向 public/。如果你挂载的是整个 Laravel 项目根目录(含 artisan、composer.json),但没把 public/ 设为 Web 根,就会 404。
检查要点:
- 确认挂载命令是否用了
-v $PWD:/app(Laravel 项目)或-v $PWD:/var/www/html(传统 PHP 项目)——路径必须和 Caddyfile 里root一致 - 查看容器内是否真实存在
/app/public/index.php,而不是/app/index.php - 运行
docker exec -it<container_id>ls -l /app/public/</container_id>直接验证文件可见性 - 如果使用自定义 Caddyfile,务必通过
-v /path/to/Caddyfile:/etc/frankenphp/Caddyfile显式挂载,否则镜像内置配置仍生效
worker 模式下还容易漏掉一点:Docker 启动命令末尾必须加 console(如 docker run ... dunglas/frankenphp console),否则容器会以默认 server 模式启动,不加载 worker 入口
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











