frankenphp在macos上必须于项目根目录(含caddyfile和public/)执行./frankenphp,caddyfile须严格命名为大写c开头、无后缀、lf换行且权限可读,否则静默失败。

在 macOS 上为 FrankenPHP v1.2.1 编写自定义 Caddyfile,核心是让二进制程序在启动时能准确加载你写的配置,而不是退回到仅监听 localhost:80 的最小内置配置;文件名大小写、路径位置、换行符格式这三处极易出错,一步错就全程静默失败。
确认 FrankenPHP 当前工作目录和权限
打开终端,cd 进入你的 PHP 项目根目录(即包含 public/ 的那一层),确保该目录下能直接执行 ./frankenphp —— 如果报 command not found,请先 chmod +x ./frankenphp。
运行 ls -l Caddyfile 验证文件存在且权限可读:macOS 默认是可读的,但如果你从 Windows 复制或解压了 zip 包,可能继承了不可读属性,此时执行 sudo chmod 644 Caddyfile。
【Caddyfile 必须严格命名为大写 C 开头、无任何后缀,如 Caddyfile.txt 或 caddyfile 都不会被识别】
编写基础 Caddyfile 内容(适配 macOS 本地开发)
用 VS Code、TextEdit(纯文本模式)或 nano 创建新文件,保存为 Caddyfile(不带扩展名),内容如下:
localhost {
root * ./public
php_server
}
注意:必须用 LF 换行(Unix 风格),不要用 CRLF(Windows 风格)。TextEdit 默认是 CR 换行,会解析失败且无提示;VS Code 右下角状态栏会显示 “LF” 或 “CRLF”,点击切换即可。
这一段声明了只响应 Host 头为 localhost 的请求,并将 ./public 设为 Web 根目录,php_server 指令启用 PHP 执行支持——FrankenPHP v1.2.1 已内置该指令,无需额外安装模块。
验证 Caddyfile 是否被成功加载
方法一:注入语法错误触发报错
在 Caddyfile 开头加一行非法指令,例如 x-invalid-directive,然后运行 ./frankenphp run。若终端立即输出 adapt: parsing caddyfile tokens: invalid directive...,说明文件已被读取并解析;若直接进入服务运行状态(显示 “Starting FrankenPHP…”),则证明根本没找到或跳过了该文件。
方法二:检查监听地址是否变化
正常加载 Caddyfile 后,FrankenPHP 不再只监听 localhost:80。你可以在 Caddyfile 中显式加一句 bind :8080,再运行 ./frankenphp run,然后执行 lsof -i :8080 —— 若看到 frankenphp 进程占用了该端口,即为生效。
【macOS 上不能依赖 ~/Library/LaunchDaemons 或 brew services 自启来加载 Caddyfile;必须手动 cd 到含 Caddyfile 的目录再执行命令】
为正式域名配置 HTTPS(需公网可访问)
第一步:确保 DNS 解析已指向你的 macOS 机器公网 IP,并在路由器上做端口转发(80 和 443 映射到本机)。
第二步:修改 Caddyfile,将 localhost 替换为你的域名,例如 myapp.dev:
myapp.dev {
root * ./public
php_server
}
第三步:启动前设置环境变量 SERVER_NAME=myapp.dev,否则 FrankenPHP 会因无法匹配 ACME 域名而 fallback 到自签名证书或拒绝 TLS 握手。
第四步:执行 SERVER_NAME=myapp.dev ./frankenphp run。首次运行会自动向 Let’s Encrypt 申请证书,耗时约 10–30 秒,日志中出现 autosaved config 即表示成功。
注意:.dev 域名必须由公共 DNS 解析,不能仅靠 /etc/hosts;否则 ACME HTTP-01 挑战必然失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











