frankenphp端口被占用需先查pid:管理员运行netstat -ano | findstr :80或:443,若pid=4则禁用w3svc等系统服务;否则可终止对应进程或改frankenphp serve --addr :8080等配置。

FrankenPHP 启动时报“端口被占用”,基本就是 80 或 443 被其他进程抢了——它默认监听这两个端口,且启动时不会自动 fallback 或提示可用端口,直接失败。
查谁在用 80/443 端口(必须管理员权限)
FrankenPHP 不会告诉你 PID,得自己查。打开管理员命令提示符,执行:
netstat -ano | findstr :80
如果没输出,再试:
netstat -ano | findstr :443
看到类似 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 这样的行,末尾的 4 就是 PID。注意:PID=4 几乎肯定是系统级 HTTP.sys 驱动(不是普通进程),不能 taskkill /f /pid 4,否则蓝屏或网络中断。
- 若 PID 是
4或System,优先走「禁用系统服务」路径 - 若 PID 是
1234且对应进程是httpd.exe、nginx.exe、Skype.exe或sqlservr.exe,可安全终止 - Windows 11 上还常见
WpnUserService或MicrosoftEdgeUpdate.exe偶尔劫持 80 端口,重启系统常能释放
停掉抢端口的系统服务(PID=4 场景专用)
按 Win+R → 输入 services.msc → 找到并右键停止以下服务(顺序无关):
-
World Wide Web Publishing Service(W3SVC) -
SQL Server Reporting Services(SSRS) Web Deployment Agent Service-
BranchCache(有时也占 80)
停止后,双击进属性 → 把「启动类型」全改成「禁用」,防止开机自启再抢。改完不用重启,FrankenPHP 下次启动就能绑上 80。
改 FrankenPHP 监听端口(最稳妥通用方案)
FrankenPHP 的端口配置不在 GUI,而在启动命令或配置文件里。常见两种方式:
- 如果用
frankenphp serve命令启动:加--addr :8080参数,例如frankenphp serve --addr :8080 - 如果用
frankenphp webserver(旧版):改frankenphp.yaml,确保有server: { addr: ":8080" } - 如果跑在 Docker 里:检查
docker run -p 8080:80是否写反了,应为-p 8080:8080并同步改配置里的addr
改完别忘了更新你代码里硬写的 URL(比如 http://localhost → http://localhost:8080),不然前端请求仍发到 80。
验证失败原因要看 error.log 而不是控制台
FrankenPHP 启动失败时,控制台只报错不给上下文。真正有用的线索在日志里:
- Windows 默认日志路径是
%USERPROFILE%\AppData\Local\frankenphp\logs\error.log - 重点搜
listen tcp :80: bind: address already in use或failed to listen on - 如果看到
permission denied,说明你没用管理员权限运行;如果看到no such file or directory,大概率是frankenphp.yaml路径写错或格式非法(YAML 对缩进敏感)
端口冲突本身不难解,但容易卡在「以为杀掉了进程,其实 HTTP.sys 还挂着」或者「改了配置但没生效,因为 FrankenPHP 没读那个 yaml 文件」——动手前先确认它到底加载的是哪个配置、以什么权限跑的。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











