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