frankenphp启动报2019端口被占用,需先用netstat -ano | findstr :2019查pid,再用tasklist | findstr pid识别进程;若为frankenphp.exe或php.exe可安全终止,若pid=4则需禁用w3svc等系统服务,否则改配置为--addr :2020或更新frankenphp.toml中server.address。

FrankenPHP 启动时报“2019端口被占用”,说明它尝试监听的 127.0.0.1:2019(或你配置的其他地址+端口)已被另一个进程抢先绑定。这不是 FrankenPHP 自身 bug,而是系统级端口冲突——必须查 PID、判进程、再决定杀还是改。
怎么快速定位占 2019 端口的进程(Windows)
管理员权限运行 CMD 或 PowerShell,执行:
netstat -ano | findstr :2019
若输出类似 TCP 127.0.0.1:2019 0.0.0.0:0 LISTENING 1234,末尾 1234 就是 PID。接着查进程名:
tasklist | findstr "1234"
- 显示
frankenphp.exe→ 很可能是上一个实例没退出干净,可安全终止 - 显示
php.exe或php-cgi.exe→ 可能是其他 PHP 内置服务器残留 - 显示
System且 PID = 4 → 是 Windows HTTP.sys 驱动在占,不能taskkill,需禁用相关服务 - 显示
Skype.exe、com.docker.backend.exe、ZoomOpener.exe→ 用户软件,关掉即可
macOS 上查 2019 端口谁在用
终端执行:
lsof -P -n -i :2019
重点看 PID 和 COMMAND 列:
-
COMMAND是frankenphp→ 清理旧实例:kill -15 $(pgrep -f "frankenphp.*2019") -
COMMAND是php且命令行含server:run或messenger:consume→ 对应 Symfony 场景,按需 kill - 无输出但启动仍失败 → 补充执行:
sudo lsof -iTCP -sTCP:LISTEN | grep :2019,避免漏掉 root 进程(如 ControlCenter 偶尔劫持)
改 FrankenPHP 监听端口(推荐长期方案)
比反复清理更可靠,尤其适合多项目共存或 CI/CD 场景。修改方式取决于启动方式:
- 命令行启动:
frankenphp serve --addr :2020(把:2019换成空闲端口) - 使用
frankenphp.toml配置文件:改[server]段下的address = "127.0.0.1:2020" - Docker 启动:确保
docker run -p 2020:2020,且容器内配置也指向:2020,别写成-p 2020:2019
改完记得同步更新代码里硬编码的 URL(比如前端 fetch 地址、健康检查路径),否则请求仍发往 :2019。
为什么 error.log 比控制台更关键
FrankenPHP 控制台报错通常只有一行 listen tcp :2019: bind: address already in use,不告诉你上下文。真正有用的信息在 error.log 里,例如:
- 是否尝试了多个地址(
127.0.0.1:2019失败后又试[::1]:2019) - 是否因
/tmp/frankenphp.sock文件残留导致 Unix socket 冲突(即使你配的是 TCP) - 是否在 TLS 模式下还同时监听了 HTTP,造成双绑失败
启动前先 ls -l /tmp/frankenphp.sock(Linux/macOS)或检查 Windows 的命名管道路径,有就 rm -f 或手动删——这点容易被忽略,但高频引发“明明换了端口还起不来”的假象。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











