查残留 frankenphp 进程最准的命令是 lsof 或 netstat + tasklist,需先确认是否自身实例未退出干净,再排查 /tmp/frankenphp.sock 文件残留及前端硬编码地址问题。

查残留 FrankenPHP 进程最准的命令是 lsof 或 netstat + tasklist
FrankenPHP 重启失败报端口冲突,八成不是别人抢了端口,而是上一个实例根本没退出干净——它还在后台监听着,新进程一 bind 就撞上。别急着改端口,先确认是不是自己人没走。
macOS/Linux 下直接跑:lsof -P -n -i :8000(把 8000 换成你实际用的端口),看输出里 COMMAND 列是不是 frankenphp;Windows 必须用管理员权限执行:netstat -ano | findstr :8000,再用 tasklist | findstr "1234"(1234 是上一步查到的 PID)确认进程名。
- 如果
COMMAND或进程名含frankenphp、php-server或带--addr参数,就是它自己没退 - 如果
lsof或netstat查不到,但启动仍失败,可能是/tmp/frankenphp.sock文件残留导致的“假冲突” - 别信 IDE 终止按钮或 Ctrl+C —— 很多终端关闭后进程仍在后台运行
kill -15 比 taskkill /F /PID 更安全
确认是 FrankenPHP 自己残留后,别一上来就强杀。它需要时间清理 Unix socket、子进程和临时文件,硬 kill 容易留下 /tmp/frankenphp.sock 或孤儿 worker。
- Linux/macOS:先
kill -15 PID,等几秒再ps -p PID确认是否退出;没响应再kill -9 PID - Windows:用
taskkill /PID 1234(不加/F),比taskkill /F /PID 1234更稳妥 - 杀完顺手清 socket:
rm -f /tmp/frankenphp.sock(Linux/macOS/WSL),Windows 不用管这个文件 - 绝对不要
pkill php或taskkill /IM php.exe—— 会误杀正在跑的 Laravel queue 或 Symfony messenger
改 --addr 是开发中最省心的长期方案
频繁启停时反复查 PID、kill 进程效率低,还容易漏。固定一个空闲端口并写死配置,比每次手动排障更可靠。
- 命令行启动直接加参数:
frankenphp serve --addr :8080(注意不是frankenphp php-server,那是旧命令) - 用
frankenphp.toml配置更稳:[server] address = "127.0.0.1:8080"
- Docker 用户注意:
docker run -p 8080:8080和配置里的address必须一致,否则服务不响应 - 前端代码里所有
http://localhost都得同步改成http://localhost:8080,否则请求照发旧端口
Windows 上 PID=4 是系统级 HTTP.sys,不能杀
Windows 下 netstat 输出末尾是 4,基本等于 System 进程在用,背后是内核驱动 HTTP.sys。这是 Windows 的底层 HTTP 协议栈,IIS、W3SVC、Web Deploy Agent 都依赖它。
-
taskkill /f /pid 4会导致蓝屏、断网或整个系统 HTTP 功能瘫痪 - 正确做法是进
services.msc找到并停止:World Wide Web Publishing Service (W3SVC)、Web Deployment Agent Service - 或者干脆绕开:改用
--addr :8080,彻底避开 80/443 - Win11 还要注意
WpnUserService和MicrosoftEdgeUpdate.exe偶尔也会劫持 80 端口,重启系统常能释放
/tmp/frankenphp.sock 文件残留和前端代码里硬写的 localhost 地址 —— 它们不会出现在 netstat 或 lsof 结果里,但足以让 FrankenPHP 启动失败。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











