FrankenPHP与Apache冲突本质是端口抢占,需查清80/443占用者:Windows用管理员运行netstat -ano | findstr :80/:443查PID,PID=4禁用W3SVC等系统服务,非4则taskkill /F /IM httpd.exe或改FrankenPHP端口为:8080。

FrankenPHP 和 Apache 冲突,本质是两者都想监听 :80 或 :443 —— 不能共存,必须让一个让路。
查清谁在监听 80/443(Windows 必须管理员权限)
FrankenPHP 启动失败时不会告诉你 PID,得自己查。打开管理员命令提示符,执行:
netstat -ano | findstr :80
如果没输出,再试:
立即学习“PHP免费学习笔记(深入)”;
netstat -ano | findstr :443
看最后一列数字:若为 4,基本是 Windows 的 HTTP.sys 驱动(系统级,不能 taskkill);若为其他数字(比如 1234),再运行:
tasklist | findstr "1234"
常见结果:
-
httpd.exe→ Apache 正在运行,冲突源确认 -
frankenphp.exe→ 旧 FrankenPHP 实例没退出,可安全终止 -
System+ PID=4 → 走禁用服务路径,别硬杀
停掉 Apache 是最直接的解法(但得确认你不需要它)
如果你当前只用 FrankenPHP,Apache 就是纯干扰项:
- 在任务管理器中结束所有
httpd.exe进程 - 或命令行执行:
taskkill /F /IM httpd.exe - 更彻底:按
Win+R→ 输入services.msc→ 找到Apache2.4(或类似名称的服务)→ 右键「停止」,再设「启动类型」为「禁用」
注意:某些一键环境(如 XAMPP、phpStudy)的 Apache 服务名不叫 Apache2.4,可能带版本号或厂商前缀,看 tasklist 输出匹配进程名更准。
改 FrankenPHP 端口比动 Apache 更安全(推荐首选)
FrankenPHP 默认绑 :80,但改端口只要一行命令,不影响任何现有配置:
- 用命令启动时:
frankenphp serve --addr :8080 - 用
frankenphp.yaml配置时:确保有server: { addr: ":8080" } - 跑 Docker 时:检查
docker run -p 8080:8080(不是-p 8080:80),且容器内配置也指向:8080
改完后,前端代码里所有写死的 http://localhost 得同步改成 http://localhost:8080,否则请求仍发向 80,404 或超时。
Mac/Linux 下查冲突要用 lsof,不是 netstat
macOS 和 Linux 上 netstat 不显示 PID,lsof 才是真·精准工具:
lsof -P -n -i :80
输出里看 PID 和 COMMAND 列:
- 若
COMMAND是httpd或apache2,说明 Apache 在跑 - 若
COMMAND是frankenphp,说明是自己上次没退出干净 - 若无输出但启动仍失败,加
sudo lsof -iTCP -sTCP:LISTEN | grep :80,过滤出真正监听的 TCP 服务
Linux 用户注意:lsof 默认可能未安装,先 sudo apt install lsof(Ubuntu/Debian)或 sudo yum install lsof(CentOS/RHEL)。
端口冲突不是 FrankenPHP 的 bug,而是操作系统对 socket 绑定的硬性限制。关键不在“哪个更好”,而在“谁该让出 80”——多数开发场景下,让 FrankenPHP 改端口比动 Apache 更轻量、更可控,尤其当 Apache 是系统服务或被其他工具依赖时。



















