frankenphp v1.3在macos启动失败时,首要排查gatekeeper拦截、端口冲突(用lsof -p -n -i :端口定位残留进程)、/tmp/frankenphp.sock残留及特权端口误用;确认二进制为mach-o格式,启用-v参数或重定向stderr捕获真实错误。

FrankenPHP v1.3 在 macOS 上启动失败时,终端常只显示 bind: address already in use 或静默退出,根本看不到具体哪一步卡住——这说明问题不在代码或路由配置,而藏在系统级资源抢占、Gatekeeper拦截或进程残留里。
先确认是不是被 macOS Gatekeeper 拦了
双击或执行 ./frankenphp 报 Operation not permitted,不是权限没加,是 Apple 强制拦截未公证二进制。
右键 Finder 中的 frankenphp 文件 → 选择“打开” → 点“仍要打开”。这次豁免后,终端里 ./frankenphp --version 就能正常响应。
如果要用脚本批量部署,运行:xattr -d com.apple.quarantine frankenphp。注意:这个命令只对 Safari/Chrome 下载的文件有效;若用 curl -O 获取,得先 open -a Finder . 触发 quarantine 标记再清除。
【必须检查】 运行 file $(which frankenphp),输出必须含 Mach-O 64-bit executable。如果显示 shell script,说明 PATH 里有同名脚本覆盖了真实二进制,删掉或重命名它。
查端口冲突:从最可能的开始筛
FrankenPHP v1.3 默认监听 :8000,但你启动命令里写了 --addr :8080,那冲突端口就是 8080,不是默认值。
第一步:快速定位谁在用端口
终端执行:lsof -P -n -i :8000(把 8000 换成你实际配的端口)。有输出就看 COMMAND 列——如果是 frankenphp、php 或 messenger:consume,说明旧实例根本没退干净。
第二步:没输出但还是起不来?补查 TCP LISTEN 状态
运行:sudo lsof -iTCP -sTCP:LISTEN | grep :8000。加 sudo 才能看到 AirPlay 接收器、ControlCenter 或 launchd 托管的服务(比如它们常悄悄占 :7000 或 :8000)。
第三步:确认是不是自己人没走
看到 PID 后,别急着 kill -9。先 ps -p [PID] 确认进程还在,再 kill -15 [PID] 发 SIGTERM。等 2 秒,重新跑 lsof -i :8000 —— 如果还有,再 kill -9 [PID]。
别漏掉 Unix socket 文件残留
FrankenPHP v1.3 启动时会尝试创建 /tmp/frankenphp.sock,异常退出后这个文件可能还躺在那里,新进程一碰就报 Address already in use,错误信息里甚至带 unix:///tmp/frankenphp.sock 路径。
执行:ls -l /tmp/frankenphp.sock。如果存在,直接删:rm -f /tmp/frankenphp.sock。
这一步不能跳过。即使端口空闲、Gatekeeper 已放行,socket 文件残留也会让启动卡在初始化阶段,连日志都不输出一行。
看启动日志找真实报错点
方法一:加 -v 参数看详细输出
运行:frankenphp serve -v --addr :8000。v1.3 的 verbose 模式会打印 PHP 扩展加载过程、socket 绑定尝试、Caddy 配置解析步骤——真正失败那行上面几行,往往就是根因。
方法二:重定向 stderr 单独捕获
执行:frankenphp serve --addr :8000 2>&1 | head -n 20。很多关键错误(比如 failed to load PHP extension "curl"、opcache is disabled)只写到 stderr,不刷屏也不存日志文件。
如果看到 permission denied 且端口是 :80 或 :443,说明你在非 root 权限下绑特权端口。改用 --addr :8080 即可,不用 sudo。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











