本來(lái)使用 stream_socket_pair
是用來(lái)父子進(jìn)程間通信的,實(shí)現(xiàn)多進(jìn)程下,某個(gè)子進(jìn)程消息通過(guò)父進(jìn)程轉(zhuǎn)發(fā)給其他子進(jìn)程(類似于 qq
),但是這碰到了一個(gè)問(wèn)題:
$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("創(chuàng)建子進(jìn)程失敗");
} else if ($pid > 0) {
fclose($pair);
$child = $pair;
$childConn = $child;
// 監(jiān)聽(tīng)子進(jìn)程消息
listenChild($child);
} else {
fclose($pair);
$parent = $pair;
// 監(jiān)聽(tīng)父進(jìn)程消息
listenParent($parent);
}
}
以上目的就是為每個(gè)子進(jìn)程創(chuàng)建與父進(jìn)程的通信通道,然結(jié)果卻發(fā)生了令人意外的效果!
比如下面一個(gè)通信過(guò)程:
父進(jìn)程pid: 30246
子進(jìn)程pid: 30247 30248 30249 30250,每個(gè)子進(jìn)程中都監(jiān)聽(tīng)客戶端連接。
客戶端A 進(jìn)入子進(jìn)程 30247
客戶端B 進(jìn)入子進(jìn)程 30248
A 客戶端發(fā)送消息,子進(jìn)程 30247 接受到消息,要求轉(zhuǎn)發(fā)給 30248 中的客戶端 B
子進(jìn)程 30247 調(diào)用事先保存的 $parent(與父進(jìn)程的通信連接),發(fā)送消息
... 意外產(chǎn)生了??!
你可能想當(dāng)然的以為,他絕對(duì)是發(fā)送給父進(jìn)程(30246)!
而實(shí)際上不是!結(jié)果可能是其他子進(jìn)程!
到這兒,我就很郁悶了,stream_socket_pair 創(chuàng)建的成對(duì)套接字,怎么會(huì)發(fā)生這種現(xiàn)象??
我表示特別無(wú)語(yǔ)了 ....跪求大神解救