本来使用 stream_socket_pair
是用来父子进程间通信的,实现多进程下,某个子进程消息通过父进程转发给其他子进程(类似于 qq
),但是这碰到了一个问题:
$count = 4;
$childConn = [];
$parent = null;
for ($i = 0; $i < $count; ++$i)
{
$pair = stream_socket_pair(STREAM_PF_UNIX , STREAM_SOCK_STREAM , STREAM_IPRROTO_IP);
$pid = pcntl_fork();
if ($pid < 0) {
throw new Exception("创建子进程失败");
} else if ($pid > 0) {
fclose($pair);
$child = $pair;
$childConn = $child;
// 监听子进程消息
listenChild($child);
} else {
fclose($pair);
$parent = $pair;
// 监听父进程消息
listenParent($parent);
}
}
以上目的就是为每个子进程创建与父进程的通信通道,然结果却发生了令人意外的效果!
比如下面一个通信过程:
父进程pid: 30246
子进程pid: 30247 30248 30249 30250,每个子进程中都监听客户端连接。
客户端A 进入子进程 30247
客户端B 进入子进程 30248
A 客户端发送消息,子进程 30247 接受到消息,要求转发给 30248 中的客户端 B
子进程 30247 调用事先保存的 $parent(与父进程的通信连接),发送消息
... 意外产生了!!
你可能想当然的以为,他绝对是发送给父进程(30246)!
而实际上不是!结果可能是其他子进程!
到这儿,我就很郁闷了,stream_socket_pair 创建的成对套接字,怎么会发生这种现象??
我表示特别无语了 ....跪求大神解救
貌似你的两个连接用反了……