frankenphp 1.4 启动报“address already in use”根本原因是端口被其他进程(含自身残留worker)抢先监听,需用lsof/netstat查pid确认是否frankenphp自身未退出,再kill-15优雅终止并清理/tmp/frankenphp.sock,或改server.address为可用端口。

FrankenPHP 1.4 启动时报端口占用(如 Address already in use),根本原因不是程序缺陷,而是它尝试绑定的地址(比如 :8000 或 127.0.0.1:80)已被另一个进程抢先监听。解决的关键是精准识别并清理冲突源,而不是盲目改端口或强杀进程。
确认是不是 FrankenPHP 自己没退出干净
很多人以为关闭终端、点 IDE 停止按钮或按 Ctrl+C 就等于服务停了,其实不然。FrankenPHP 1.4 默认以多进程模式运行(类似 Workerman),主进程退出后,worker 子进程可能仍在后台静默监听端口。
-
Linux/macOS/WSL:运行
lsof -P -n -i :8000
把
8000换成你实际配置的端口。如果输出中COMMAND列显示frankenphp,或COMMAND是php且ARGS含php-server、--addr、--document-root等参数,就是它自己残留。 -
Windows(管理员权限运行):
netstat -ano | findstr :8000 tasklist | findstr "1234"
把
1234替换为上一步查到的 PID。若进程名为frankenphp.exe或php.exe(且命令行含php-server),说明是旧实例未清理。
安全终止残留 FrankenPHP 进程
别用 pkill php 或 taskkill /IM php.exe,会误伤 Laravel queue、Symfony messenger worker 等正在运行的 PHP 服务。
-
Linux/macOS:
- 先优雅终止:
kill -15 <pid></pid>(给它时间清理/tmp/frankenphp.sock和子进程) - 若无响应再强制:
kill -9 <pid></pid> - 清理 socket 文件:
rm -f /tmp/frankenphp.sock
- 先优雅终止:
-
Windows:
- 先尝试:
taskkill /PID <pid></pid>(不加/F) - 再不退出:
taskkill /F /PID <pid></pid> - 删除 socket 文件(如有):
del /f C:\tmp\frankenphp.sock或你配置的路径
- 先尝试:
快速绕过系统级端口冲突(特别是 Windows 的 PID=4)
如果查到 PID = 4 占着 :80 或 :443,这是 Windows HTTP.sys 驱动在工作,绝不可 taskkill /F /PID 4 ——会导致蓝屏、断网或服务瘫痪。
- 正确做法:打开
services.msc,停用并禁用以下服务:- World Wide Web Publishing Service (W3SVC)
- Web Deployment Agent Service
- SQL Server Reporting Services(如已安装)
- 更省事方案:直接换端口,避免动系统服务。
改用固定空闲端口并写死配置(推荐开发环境长期使用)
比起每次手动查杀,一劳永逸的方式是让 FrankenPHP 1.4 启动时就用一个明确空闲的端口:
-
命令行启动(最简):
frankenphp php-server --addr :8080
注意:
frankenphp serve是旧命令,1.4 推荐用php-server。 -
TOML 配置文件(
frankenphp.toml)(更可靠):[server] address = "127.0.0.1:8080" # 若启用 HTTPS,同步改: # tls.address = "127.0.0.1:8443"
-
Docker 用户注意:
docker run -p 8080:8080中的宿主机和容器端口必须与配置中address一致;否则服务不会响应。 -
前端也要同步改:代码里硬写的
http://localhost或http://localhost:8000,得改成http://localhost:8080,否则请求仍发往旧端口。
别忽略 Unix domain socket 文件残留
FrankenPHP 1.4 默认使用 /tmp/frankenphp.sock(Linux/macOS/WSL)与 Caddy 通信。异常退出后该文件不会自动删除,新实例尝试复用时会报 Address already in use,现象和端口冲突一模一样,但实际无关端口。
- 检查是否存在:
ls -l /tmp/frankenphp.sock - 存在就删:
rm -f /tmp/frankenphp.sock - Windows(纯系统)不用管此文件;WSL 则同 Linux 处理。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











