直接运行frankenphp需存在caddyfile并位于项目根目录,否则静默退出或404;无caddyfile时应改用frankenphp php-server --document-root public/启动,且须确认架构匹配、系统库齐全、入口文件可读。

直接运行 frankenphp 二进制文件即可启动 Web 服务,但必须确保它在正确路径下、有执行权限、且项目结构匹配——否则会静默失败或返回 404。
为什么直接 ./frankenphp 没反应或报 404
FrankenPHP 独立二进制默认不带任何子命令时,会尝试读取当前目录下的 Caddyfile 并启动完整 Web 服务。常见卡点:
-
Caddyfile不存在或语法错误 → 启动失败,终端可能只打印一行日志后退出 - 当前目录不是项目根目录 →
root *public/找不到public/,返回 404 或空白页 - 没给执行权限 → Linux/macOS 下提示
Permission denied,Windows 下可能无响应 - 入口文件缺失 →
public/index.php不存在或不可读(如权限为 000 或换行符损坏)
不依赖 Caddyfile 的最小启动方式
如果你只想快速验证 PHP 是否能跑通,跳过 Web 层配置,用 php-server 子命令最直接:
- 确保
public/目录存在,且里面有可执行的index.php - 运行:
frankenphp php-server --document-root public/ - 端口默认是
:8000,访问http://localhost:8000即可 - 想换端口?加
--addr :8080;想指定 PHP 配置文件?用--php-ini(仅限支持该参数的构建版本)
运行前必须检查的三件事
很多“运行失败”其实卡在这三个地方,而不是 FrankenPHP 本身问题:
- CPU 架构是否匹配:运行
file $(which frankenphp)和uname -m对比,x86-64vsarm64不一致就必然exec format error - 系统库是否齐全:Linux 上跑
ldd $(which frankenphp),macOS 上跑otool -L frankenphp,看有没有not found的库(如libbpf.so.1) - 入口脚本是否真能执行:临时写个
test.php放public/下,内容为<?php echo "OK"; ?>,再用frankenphp php-server --document-root public test.php直接执行,排除 Web 路由干扰
单二进制打包后的运行差异
如果你用 frankenphp build 打出了一个叫 myapp 的文件,它和原始 frankenphp 二进制行为不同:
- 它不再读
Caddyfile,也不认--document-root参数——所有配置(域名、root、HTTPS)都在构建时固化进去了 - 首次运行会自动申请 Let's Encrypt 证书(需开放 80/443 端口且域名可解析),本地测试可用
SERVER_NAME=localhost ./myapp - 没有
php-server子命令,也不能用-c加载外部php.ini——ini 是硬编码的,改不了
真正容易被忽略的是:独立二进制的 $_SERVER 变量值(比如 SCRIPT_NAME、HTTPS)和传统 Nginx+PHP-FPM 不同,Laravel/Symfony 的 URL 生成、重定向逻辑很可能因此出错,必须用真实请求验证,不能只看 CLI 输出。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











