workerman 5.2.3 支持 unix 域套接字(uds),通过 unix:// 协议前缀指定绝对路径监听,需确保 php 进程有读写权限并手动清理残留 socket 文件;客户端需用原生 socket 函数或扩展 asynctcpconnection 实现连接;uds 权限由文件系统控制,适用于主从进程间高效 ipc。

Workerman 5.2.3 支持 Unix 域套接字(UDS),只需在监听地址中使用 unix:// 协议前缀并指定 socket 文件路径即可。它比 TCP 回环更轻量、更安全,特别适合本机进程间通信(IPC),比如主服务与日志收集器、缓存代理或子工作进程之间的交互。
监听 Unix 域套接字服务端
用 unix:// 替换传统协议,路径必须是绝对路径,且确保 PHP 进程有读写权限:
- 创建 Worker 实例时传入
"unix:///tmp/myapp.sock"作为监听地址 - 启动前手动清理残留 socket 文件(
unlink('/tmp/myapp.sock')),避免Address already in use错误 - 确保目录
/tmp可写,或改用更可控的路径如/var/run/myapp/并提前mkdir -p /var/run/myapp && chown www-data:www-data /var/run/myapp
客户端连接 Unix 域套接字
Workerman 客户端(如 Worker\Connection\TcpConnection)默认不支持 UDS,需手动创建原生 socket 或用 stream_socket_client():
- 推荐方式:用 PHP 原生函数建立连接,再包装成 Workerman 连接对象(适用于自定义协议)
- 简单场景可直接用
file_get_contents('php://stdin')+stream_socket_client('unix:///tmp/myapp.sock')发起请求 - 若需异步客户端,可基于
Worker\Connection\AsyncTcpConnection扩展,重写底层 socket 创建逻辑,将AF_INET换为AF_UNIX
权限与路径注意事项
Unix 域套接字本质是文件系统节点,权限控制直接生效:
- socket 文件生成后默认权限为
0666,建议通过umask(0007)控制组/其他用户不可访问 - 服务端启动后,可用
ls -l /tmp/myapp.sock确认类型为srwxrwx---(s表示 socket) - 路径长度不能超过
sizeof(struct sockaddr_un.sun_path) - 1(通常 108 字节),避免过长路径导致绑定失败
搭配常驻进程的实际用法
在多 Worker 进程模型中,UDS 是理想的 IPC 通道:
- 主进程监听
unix:///tmp/master.sock,接收子进程注册或状态上报 - 用
Worker::setEventLoopClass()配合ev或libevent提升高并发下 UDS 的事件处理效率 - 配合
sendmsg()/recvmsg()(需扩展 PHP 扩展)可传递文件描述符,实现零拷贝数据共享,例如把数据库连接句柄转给子进程复用











