端口被占用是访问被拒绝最常见原因,应优先用netstat -ano | findstr :端口号查pid,再tasklist或任务管理器定位并结束进程,或改服务端口、禁用http.sys等系统服务。

不是必然,但端口被占用是访问被拒绝最常见、最优先要排查的原因。
netstat 查不到监听进程却报“connection refused”
这说明 FrankenPHP 根本没起来,或者刚启动就崩溃退出了。此时终端 stderr 里通常有关键线索:
-
listen tcp :80: bind: address already in use→ 端口真被占了,查netstat -ano | findstr :80 -
listen tcp :80: bind: permission denied→ Windows/macOS 上非 root 用户尝试绑定特权端口(:80、:443),改用--addr :8080或加sudo -
failed to load PHP extension "curl"→ 扩展缺失或路径错,FrankenPHP 不支持动态加载所有传统.so文件 - 空输出后直接退出 → 检查
Caddyfile语法错误,比如漏了{或拼错php块名
能查到 FrankenPHP 进程却 curl 返回 connection refused
说明它监听了地址,但没响应请求——大概率是监听地址配置和实际访问不匹配:
- FrankenPHP 默认监听
127.0.0.1:8080,但你curl http://localhost:8000→ 端口对不上 - 用了
SERVER_NAME=:80,但 Docker 启动时没加-p 80:80,只写了-p 8080:80→ 宿主机 8080 没转发到容器内 80 - 配置了
server.address: "0.0.0.0:8000",但防火墙或 WSL2 网络限制了外部访问 - macOS 上没加
sudo运行netstat,漏看了 ControlCenter 占的:7000类端口
Windows 下 PID=4 占用 80/443 怎么办
PID=4 是 System 进程,背后是 HTTP.sys 驱动,taskkill /f /pid 4 会蓝屏或断网,绝对不能杀:
- 打开
services.msc,停用并禁用:World Wide Web Publishing Service、Web Deployment Agent Service、W3SVC - 如果只是本地开发,直接换端口更安全:启动时加
--addr :8080,访问http://localhost:8080 - 确认没其他服务在抢:Skype、IIS Express、SQL Server Reporting Services、MicrosoftEdgeUpdate.exe 都可能静默占 80
真正麻烦的不是“端口被占”,而是占着端口的进程没退出——比如上次 Ctrl+Z 挂起的 FrankenPHP、supervisord 管理的 worker、或 Symfony 的 messenger:consume 子进程。它们不会出现在常规服务列表里,得靠 lsof -i :8080(macOS/Linux)或 netstat -ano | findstr :8080(Windows)逐个比对 PID 才能揪出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











