frankenphp启动后需用sudo ss -tulnp | grep :端口确认监听就绪:输出含0.0.0.0:端口及frankenphp进程名才表示成功对外监听;若为127.0.0.1:端口或无输出,需检查启动参数、权限或日志错误。

ss -tulnp 查 FrankenPHP 监听端口是否就绪
FrankenPHP 启动后,必须确认它真正在监听目标端口且对外可访问,而不是只绑在 127.0.0.1 或压根没起来。用 ss 是最直接的方式——它不依赖 DNS、不查进程名映射、不走 /proc 遍历,直接读内核 socket 表,快且准。
执行命令:sudo ss -tulnp | grep :8080(把 8080 换成你实际用的端口)
- 有输出且含
frankenphp或php进程 → 启动成功,监听地址是*:8080(即0.0.0.0:8080)才允许外部连接 - 输出中 Local Address 是
127.0.0.1:8080→ 外部 curl 会失败,需检查启动参数是否加了--listen 127.0.0.1:8080,应改为--listen :8080 - 无输出但 FrankenPHP 日志显示 “Starting on http://…” → 很可能启动闪退或被 systemd 立即 kill,需查
journalctl -u frankenphp -n 50
ss -tuln | grep :8080 不显示进程名?权限没加 sudo
ss -tuln 默认不显示 PID 和进程名,这是常见盲区。很多人只跑这一条,看到端口在 LISTEN 就以为“占用了”,却不知道是谁占的——结果误杀 Nginx 或数据库。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
关键点:显示进程信息必须加 -p,而 -p 在绝大多数发行版上要求 root 权限才能读取其他用户进程的 fd 信息。
- 错:
ss -tuln | grep :8080→ 只能看到端口状态,看不到users:(("frankenphp",pid=1234,fd=6)) - 对:
sudo ss -tulnp | grep :8080→ 才能确认是不是 FrankenPHP 自己在监听 - 如果提示
Permission denied→ 当前用户没被加入netadm或sudoers,别硬试,直接切 root 或加 sudo
FrankenPHP 启动失败报 “Address already in use”,但 ss -tulnp 没结果?查 UDP 或隐式绑定
FrankenPHP 只用 TCP,但某些场景下 UDP 占用会导致 TCP 绑定失败,尤其在 WSL、systemd-networkd 或容器网络栈里。另外,ss -tulnp 默认不显示 UDP,容易漏掉。
- 补查 UDP:
sudo ss -uulnp | grep :8080(注意是-uuln,两个u表示 UDP + LISTEN) - 检查是否被 HTTP.sys(Windows)或 kernel_task(macOS)占了 → 这时
ss也查不到,得换lsof -P -n -i :8080 - FrankenPHP 容器内非 root 用户启动时绑
:80报错,ss根本不会显示任何记录 → 因为 bind 失败,进程根本没进入 LISTEN 状态,此时要先看日志里的bind: permission denied
ss 输出里 users:(("php",pid=1234,fd=6)),怎么确认是 FrankenPHP 而不是 php-cgi?
进程名都是 php,光靠 ss 无法区分。必须结合启动上下文和完整命令行验证。
- 用
ps -fp 1234看完整命令,FrankenPHP 启动命令一定含frankenphp或server子命令,例如:/usr/bin/frankenphp server --listen :8080 - 更可靠方式:
cat /proc/1234/cmdline | tr '\0' ' '→ 避免命令被截断,能看清所有参数和二进制路径 - 如果 cmdline 里只有
php-cgi或php-fpm→ 不是 FrankenPHP,是残留旧进程,该 kill
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










