frankenphp启动失败因端口被占,需用sudo lsof -itcp -stcp:listen -p -n | grep :8000查占用进程,确认后kill -15 pid并删除/tmp/frankenphp.sock,再改frankenphp.toml中server.address为冷门端口如:8088。

macOS 15 Sequoia 安装 FrankenPHP v1.4 后启动失败,终端最后一行显示类似 listen tcp :8000: bind: address already in use,说明系统中已有进程抢先绑定了你配置的端口——这不是安装问题,而是 macOS 网络资源竞争的典型表现。
确认谁在占端口
必须用 sudo 权限运行,否则看不到 ControlCenter、AirPlay 接收、launchd 托管服务等系统级监听者:
执行 sudo lsof -iTCP -sTCP:LISTEN -P -n | grep :8000(把 8000 换成你实际报错的端口号);
重点看 COMMAND 和 PID 两列:如果 COMMAND 是 frankenphp 或含 php-server 的 php 进程,就是你自己上次没退出干净;如果看到 ControlCenter、kernel_task 或 sharingd,说明是 macOS 系统服务在静默占用(Sequoia 中 AirPlay 接收默认监听 :7000,但部分第三方工具会劫持 :8000);
若输出为空,但错误依旧,立刻换查 IPv6 监听:sudo lsof -i6TCP -sTCP:LISTEN | grep :8000——Sequoia 默认启用双栈,[::]:8000 被占时 lsof -i :8000 常漏掉。
安全终止残留 FrankenPHP 进程
方法一:精准杀主进程 + worker(推荐)
先查完整命令行:ps -p PID -o args=(PID 替换为上一步查到的数字),确认含 --addr 或 php-server;
发 SIGTERM 让它自行清理 socket:kill -15 PID;
等待 2 秒后再次运行 sudo lsof -i :8000,确认无输出;
方法二:强制清空所有 frankenphp 相关进程(仅限开发环境)
pkill -f "frankenphp.*--addr\|php-server" —— 这条命令带正则过滤,不会误伤 messenger:consume 或普通 php -S;
【注意】不要用 pkill php,Sequoia 下 PHP CLI 进程名统一为 php,极易误杀正在跑的队列或测试脚本。
清理 Unix socket 文件残留
FrankenPHP v1.4 默认使用 /tmp/frankenphp.sock 与 Caddy/Nginx 通信,异常退出后该文件常残留,新实例启动时会因 Address already in use 失败,且错误不提示路径:
运行 ls -l /tmp/frankenphp.sock,若存在则立即执行:rm -f /tmp/frankenphp.sock;
若你改过 socket 路径(如在 frankenphp.toml 中设了 unix_socket = "/var/run/myapp.sock"),请同步检查并删除对应路径文件;
这一步不做,即使端口空闲,启动仍会失败。
永久避开端口冲突(推荐设置)
第一步:修改配置文件,固定一个冷门端口
打开 frankenphp.toml,找到 [server] 段;
将 address = "127.0.0.1:8000" 改为 address = "127.0.0.1:8088"(8088 在 Sequoia 中极少被系统服务占用);
第二步:同步更新前端请求地址
检查项目中所有硬编码的 http://localhost 或 http://127.0.0.1,把端口统一改为 :8088;
第三步:验证启动
执行 frankenphp serve(v1.4 已弃用 php-server 子命令),观察终端是否输出 Serving on http://127.0.0.1:8088。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











