unixsocket专用于本机ipc,基于文件路径(如unix:/tmp/swoole.sock),不走网络协议栈,性能更高;tcpsocket用于网络通信,支持跨机器,需处理粘包、超时等,localhost或127.0.0.1均走完整tcp流程。

UnixSocket 和 TCPSocket 在 Swoole 中不是“可互换的传输方式”,而是面向完全不同的通信场景:前者只用于本机进程间通信(IPC),后者用于网络通信(跨进程、跨机器)。
UnixSocket 只能本地用,路径即地址
UnixSocket 本质是操作系统提供的文件系统级 IPC 机制,Swoole 通过 unix:/path/to/sock 这样的地址字符串来识别它。它不走网络协议栈,没有 IP、端口、三次握手这些概念。
- 必须指定绝对路径,比如
unix:/tmp/swoole.sock;相对路径或无路径会直接报错Invalid argument - 文件权限必须正确:运行 Swoole Server 的用户需对该 sock 文件有读写权限,否则客户端连接时抛出
Connection refused - 客户端和服务端必须在同一台机器上;填
localhost或127.0.0.1都无效,它们触发的是 TCP 连接 - 性能比本地 TCP 高——实测延迟低 10%~30%,因为跳过了内核网络协议栈
TCPSocket 默认走网络,127.0.0.1 也是真 TCP
Swoole 的 TCP 类型监听(如 0.0.0.0:9501)走标准 TCP/IP 协议栈,哪怕客户端连的是 127.0.0.1,数据也要封装成 IP 包、经 loopback 设备、触发软中断、进 socket 缓冲区——和连远程服务器流程一致。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 服务端 bind 地址为
127.0.0.1时,仅允许本机访问;设为0.0.0.0才能被外网访问(注意防火墙和bind_address配置) - 客户端 connect 时若用
localhost,PHP 默认解析为 IPv6 的::1(取决于 hosts 配置),可能和 server 绑定的 IPv4 地址不匹配,导致连接失败 - 需要处理粘包:TCP 是字节流,
onReceive回调收到的数据不保证是一个完整业务帧,得自己加协议头或分隔符 - 超时、重连、心跳都得自己实现;而 UnixSocket 虽也无内置心跳,但因无网络抖动,连接稳定性天然更高
启动方式和配置项完全不同
Swoole 启动 Server 时,协议类型由 set 配置中的 open_tcp_nodelay、tcp_defer_accept 等只对 TCP 生效;UnixSocket 则依赖 unixsock_buffer_size、unixsock_path 这类专属选项。
- UnixSocket Server 必须显式设置
type => SWOOLE_SOCK_UNIX_STREAM,不能靠地址字符串自动推断 - UnixSocket 不支持
ssl选项;TCP 才能配ssl_cert_file和ssl_key_file - UnixSocket 客户端创建用
swoole_client::connect('unix:/tmp/swoole.sock', 0, -1),第二个参数(port)必须传 0,否则会被忽略或报错 - TCPSocket 客户端 connect 第二个参数是真实 port,比如
9501,传 0 会连接失败
真正容易被忽略的是:UnixSocket 的 sock 文件不会自动清理。Server 异常退出后,残留的 .sock 文件会导致下次启动报 Address already in use;必须在 onStart 前手动 unlink() 或加 if (file_exists($path)) @unlink($path); ——这个细节文档很少提,但线上踩过坑的人都知道。










