443端口被占用是FrankenPHP启动失败最常见原因,须以管理员权限运行netstat -ano | findstr :443查PID,再用tasklist | findstr "PID"定位进程;若PID=4则为HTTP.sys系统驱动,不可强制终止,应停用W3SVC等关联服务;旧实例、Docker或nginx等用户进程可安全结束;亦可改配置使用8443等空闲端口,并同步更新Docker映射和前端URL。

443 端口被占用是 FrankenPHP 启动失败最常见原因,优先查 PID,别急着改配置或杀进程——90% 的 case 是你自己的旧实例、系统服务(W3SVC/HTTP.sys)或 Docker 残留占着没退干净。
怎么快速定位谁在用 443 端口
必须用管理员权限运行命令行,否则看不到 system 级进程:
- 查端口:执行
netstat -ano | findstr :443,输出最后一列是 PID - 查进程名:执行
tasklist | findstr "1234"(把 1234 换成上一步的 PID) - 常见结果含义:
→ 显示frankenphp.exe:旧实例没退出,可安全终止
→ 显示System且 PID = 4:Windows HTTP.sys 驱动在托管 443,不能taskkill
→ 显示nginx.exe、httpd.exe或com.docker.backend.exe:用户级服务,关掉即可
→ 显示svchost.exe:需进services.msc查对应服务名,别直接杀
PID = 4 的 System 进程绝对不能 kill
这是 Windows 内核级 HTTP API 驱动,不是普通进程。强制终止会导致蓝屏、网络中断或系统不稳定:
- 正确做法是打开
services.msc,停用并禁用以下服务:
→World Wide Web Publishing Service (W3SVC)
→Web Deployment Agent Service
→SQL Server Reporting Services - 禁用后重启命令行再试,否则即使你加了
--addr :8443,FrankenPHP 仍可能因系统级冲突拒绝启动
改 frankenphp.toml 或启动参数最稳妥
比起反复查杀,固定一个空闲 HTTPS 端口更适合本地开发:
立即学习“PHP免费学习笔记(深入)”;
- 命令行启动时覆盖:
frankenphp php-server --addr :8080 --tls.address :8443 - 修改配置文件
frankenphp.toml:[server]address = "127.0.0.1:8080"[server.tls]address = "127.0.0.1:8443" - Docker 用户注意:
docker run -p 8443:8443必须和配置里的tls.address一致;若写成-p 8443:443但配置仍是:443,服务不会响应 - 前端硬编码的
https://localhost要同步改成https://localhost:8443,否则请求仍发往 443
别漏掉 Unix socket 文件残留
FrankenPHP 默认用 /tmp/frankenphp.sock 与 Caddy/Nginx 通信。上次异常退出没清理,新实例会报 Address already in use,看起来像端口冲突,实则是 socket 文件卡住:
- Linux/macOS:运行
ls -l /tmp/frankenphp.sock确认存在,然后rm -f /tmp/frankenphp.sock - Windows(WSL):同上;Windows 原生路径通常是
C:\tmp\frankenphp.sock,手动删 - 这个文件不清理,哪怕你换了 8443,启动仍可能失败,而且错误日志里通常不提示具体路径



















