pid=4的system进程占用80/443端口是http.sys驱动所致,不可taskkill终止,需停用w3svc、web deployment agent或ssrs等上层服务,或改用其他端口(如:8080)并同步更新配置与前端请求地址。

Windows 上 PID=4 的 System 进程不能直接 taskkill
查到 PID=4 占着 :80 或 :443,说明是 Windows 内核的 HTTP.sys 驱动在托管端口,不是普通进程。执行 taskkill /F /PID 4 会导致网络中断、蓝屏或系统服务瘫痪——这不是 FrankenPHP 的问题,而是操作系统底层行为。
必须通过 services.msc 停用对应系统服务
HTTP.sys 本身不可禁用,但它的上层服务可以停。打开 services.msc 后,重点处理以下三项(右键 → 停止,再双击进属性 → 启动类型设为「禁用」):
World Wide Web Publishing Service (W3SVC)Web Deployment Agent Service-
SQL Server Reporting Services (SSRS)(若已安装)
改完无需重启系统,FrankenPHP 下次启动就能成功绑定 :80。注意:BranchCache 有时也会抢 :80,一并检查。
改 --addr 比动系统服务更安全通用
如果你没管理员权限、公司策略禁止改服务、或只是本地开发,直接换端口是最省事的方案:
- 命令行启动:
frankenphp serve --addr :8080 - TOML 配置(
frankenphp.toml):[server] address = "127.0.0.1:8080" - Docker 场景:确保
docker run -p 8080:8080和配置里address端口号一致
别忘了同步改前端代码里硬写的 http://localhost → http://localhost:8080,否则请求仍发向旧端口。
容易被忽略的残留 socket 文件
即使端口空闲,FrankenPHP 也可能因 Unix domain socket 文件残留报错。比如 /tmp/frankenphp.sock(Linux/macOS/WSL)或 Windows 对应临时路径下的同名文件。异常退出后它不会自动清理,新实例尝试复用时会卡在 Address already in use。
验证方式:
- Linux/macOS:
ls -l /tmp/frankenphp.sock,存在就rm -f /tmp/frankenphp.sock - Windows:
dir %TEMP%\frankenphp.sock或你配置的socket路径,手动删
这个文件不清理,哪怕换了端口、停了所有服务,FrankenPHP 仍可能启动失败——它和端口冲突无关,但错误现象高度相似。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











